本文介绍原生的ado.net(访问sql server数据库)

写在前面

  1. 数据库连接字符串

    过时的写法 string str = "server=localhost;database=my_db;uid=sa;pwd=123";
    主流的写法
    sql验证写法 string str = "Data Source=localhost;Initial Catalog=my_db;User ID=sa;Password=123";
    windows验证写法 string str = "Data Source=localhost;Initial Catalog=my_db;integrated Security=true";
    Data Source 表示数据源
    Initial Catalog 表示数据库
  2. 连接池技术

    ado.net默认采用连接池技术,当close了一个连接,会将连接对象放进程序池中,下次open,如果对象没有占用,会直接拿来用,当有其他并发用户同时操作时,会创建多个连接对象,这时拼的就是连接池容量了
    你可以在连接字符串中添加 Pooling=false 禁用连接池技术

联接模型(不缓存数据,每次查询都要重新访问数据库)

  1. Connection对象

    此对象用来连接数据库
    string str = "server=localhost;database=my_db;uid=sa;pwd=123";
    using(SqlConnection con = new SqlConnection(str))
    {
    con.Open();
    if(con.State == ConnectionState.Open)
    {
    Console.WriteLine("连接成功");
    }
    //con.Close(); 关闭实例,可以使用Open再次打开
    //con.Dispose(); 销毁实例
    }
    ConnectionState还有如下几个属性
    Broken 与数据源中断
    Closed 连接处于关闭状态
    Connecting 连接正在进行
    Executing 表示sql命令正在运行
    Fetching 正在检索数据
    Open 连接处于打开状态
  2. Command对象

    使用流程
    string str = "server=localhost;database=my_db;uid=sa;pwd=123";
    using(SqlConnection con = new SqlConnection(str))
    {
    SqlCommand cmd = new SqlCommand(); // 创建command对象,用来执行sql语句
    cmd.Connection = con; // 设置连接对象
    cmd.CommandText = "select count(*) from [dbo].[Product]";
    cmd.CommandType = CommandType.Text; // 设置sql命令为字符串类型
    // 执行sql
    con.Open();
    if(con.State == ConnectionState.Open)
    {
    var i = cmd.ExecuteScalar();
    Console.WriteLine(i);
    }
    }
    带参数sql语句的使用(防止sql注入攻击)
    string str = "Data Source=localhost;Initial Catalog=my_db;User ID=sa;Password=123";
    using (SqlConnection con = new SqlConnection(str))
    {
    using(SqlCommand cmd = new SqlCommand())
    {
    cmd.Connection = con; // 设置连接对象
    cmd.CommandText = "select count(*) from [dbo].[ProductAddress] where productAdressID > @id";
    cmd.CommandType = CommandType.Text;
    cmd.Parameters.Add(new SqlParameter("@id", SqlDbType.Int) { Value = 3 }); // 添加参数
    // 简写形式,不推荐,因为可以传递任意值 cmd.Parameters.AddWithValue("@id", 3);
    // SqlParameter parmId = new SqlParameter("@id", 0); 这样写报错,不推荐
    con.Open();
    if (con.State == ConnectionState.Open)
    {
    var i = cmd.ExecuteScalar();
    Console.WriteLine(i);
    }
    }
    }
    执行sql语句的方法
    ExecuteScalar 执行的结果只有一行一列数据,如果执行的新增sql语句带有output参数,那么返回值是新增的id
    insert into mytable output ...
    ExecuteNonQuery 不需要返回结果,也就是完成增删改
    ExecuteReader 执行的结果多行多列,完成查询操作
    用法和上面有点区别,如下
    using(var items = cmd.ExecuteReader())
    {
    if(items.HasRows)
    {
    while (items.Read())
    {
    // 每一行数据
    for(var i = 0; i < items.FieldCount; i ++)
    {
    // 每一列数据
    Console.Write(items[i]);
    }
    Console.WriteLine("");
    }
    }
    }
    执行存储过程
    string str = "server=localhost;database=my_db;uid=sa;pwd=123";
    using(SqlConnection con = new SqlConnection(str))
    {
    SqlCommand cmd = new SqlCommand(); // 创建command对象,用来执行sql语句
    cmd.Connection = con; // 设置连接对象
    cmd.CommandText = "[dbo].[myTest]";
    cmd.CommandType = CommandType.StoredProcedure; // 设置sql命令为存储过程
    cmd.Parameters.Add("@p1", SqlDbType.Int); // 添加参数
    cmd.Parameters["@p1"].Value = 3; // 设置参数值
    // 执行sql
    con.Open();
    if(con.State == ConnectionState.Open)
    {
    var items = cmd.ExecuteReader();
    while (items.Read())
    {
    // 每一行数据
    for (var i = 0; i < items.FieldCount; i++)
    {
    // 每一列数据
    Console.Write(items[i]);
    }
    Console.WriteLine("");
    }
    }
    }

非联接模型(将数据缓存在DataSet中,这种方式针对于windows控件使用比较好)

  1. DataAdapter对象

    string str = "server=localhost;database=my_db;uid=sa;pwd=123";
    using(SqlConnection con = new SqlConnection(str))
    {
    SqlCommand cmd = new SqlCommand(); // 创建command对象,用来执行sql语句
    cmd.Connection = con; // 设置连接对象
    cmd.CommandText = "select * from [dbo].[Product]";
    cmd.CommandType = CommandType.Text; // 设置sql命令为字符串类型
    // 执行sql
    con.Open();
    if(con.State == ConnectionState.Open)
    {
    SqlDataAdapter sda = new SqlDataAdapter(); // 创建SqlDataAdapter对象
    sda.SelectCommand = cmd; // 设置sql命令对象
    /*
    SelectCommand 发送查询语句,在调用Fill方法时触发
    DeleteCommand 发送删除语句,在调用Updata方法时触发
    InsertCommand 发送插入语句,在调用Updata方法时触发
    UpdateCommand 发送更新语句,在调用Updata方法时触发
    */
    DataSet ds = new DataSet(); // 创建一个DataSet对象,内存数据库
    sda.Fill(ds, "myTable"); // 调用此法会自动执行SelectCommand,将查询的数据放到ds中,第二个参数是内存表名
    var table = ds.Tables["myTable"]; // 获取表
    sda.FillSchema(table, SchemaType.Mapped); // 将数据库表结构加载到内存表中
    var t = ds.Tables["myTable"].Rows.Find(3); // 找出主键为3的行
    t["ProductName"] = "护眼台灯"; // 修改数据
    // 创建SqlCommandBuilder方便执行数据库更新操作,相当于在执行Insert,Update,Delete操作时,自动生成了sql脚本,
    // 从而在调用Update方法是可以直接更新数据,方便快捷
    SqlCommandBuilder scb = new SqlCommandBuilder(sda);
    sda.Update(table);
    }
    }
  2. DataSet和DataTable的使用

    创建一个DataSet数据库 DataSet ds = new DataSet("myDb");
    创建一张表 DataTable dt = new DataTable("mytb");
    创建列 DataColumn mydc1 = new DataColumn("id", typeof(int)); DataColumn mydc2 = new DataColumn("Name", typeof(string));
    设置列的自动编号 mydc1.AutoIncrement = true; mydc1.AutoIncrementSeed = 1; mydc1.AutoIncrementStep = 1;
    设置列非空 mydc2.AllowDBNull = false;
    将列添加到表中 dt.Columns.Add(mydc1);
    创建行 DataRow mydr = dt.NewRow(); mydr["Name"] = "叶家伟";
    将行添加到表中 dt.Rows.Add(mydr);
    将表添加到数据库中 ds.Tables.Add(dt);

ado.net代码封装

  1. 配置连接字符串

    将连接字符串提取出来方便以后修改
    在App.config配置文件中的configuration节点下添加如下代码
    <connectionStrings>
    <add name="mssqlserver" connectionString="Data Source=localhost;Initial Catalog=my_db;User ID=sa;Password=123"/>
    </connectionStrings>
    在程序中要获取这段xml配置,需要添加 System.Configuration 引用
  2. 封装代码

    public static class HandleAdoNet
    {
    private static readonly string constr = ConfigurationManager.ConnectionStrings["mssqlserver"].ConnectionString;
    public static int HandleExecuteNonQuery(string sqlstr, params SqlParameter[] param)
    {
    using(SqlConnection con = new SqlConnection(constr))
    {
    using(SqlCommand cmd = new SqlCommand(sqlstr, con))
    {
    if(param != null)
    {
    cmd.Parameters.AddRange(param);
    }
    con.Open();
    return cmd.ExecuteNonQuery();
    }
    }
    }
    public static object HandleExcuteScalar(string sqlstr, params SqlParameter[] param)
    {
    using(SqlConnection con = new SqlConnection(constr))
    {
    using(SqlCommand cmd = new SqlCommand(sqlstr, con))
    {
    if(param != null)
    {
    cmd.Parameters.AddRange(param);
    }
    con.Open();
    return cmd.ExecuteScalar();
    }
    }
    }
    public static SqlDataReader HandleExcuteReader(string sqlstr, params SqlParameter[] param)
    {
    SqlConnection con = new SqlConnection(constr); // 此链接对象需要在外界关闭
    using(SqlCommand cmd = new SqlCommand(sqlstr, con))
    {
    if(param != null)
    {
    cmd.Parameters.AddRange(param);
    }
    con.Open();
    try
    {
    return cmd.ExecuteReader(CommandBehavior.CloseConnection); // 表示此方法调用成功,自动关闭连接对象
    }
    catch
    {
    con.Close();
    con.Dispose();
    throw;
    }
    }
    }
    public static DataTable HandleSqlDataAdapter(string sqlstr, params SqlParameter[] param)
    {
    DataTable dt = new DataTable();
    using (SqlDataAdapter sda = new SqlDataAdapter(sqlstr, constr))
    {
    if(param != null)
    {
    sda.SelectCommand.Parameters.AddRange(param);
    }
    sda.Fill(dt);
    }
    return dt;
    }
    }

原生的ado.net(访问sql server数据库)的更多相关文章

  1. .NET跨平台之旅:升级至ASP.NET 5 RC1,Linux上访问SQL Server数据库

    今天微软正式发布了ASP.NET 5 RC1(详见Announcing ASP.NET 5 Release Candidate 1),.NET跨平台迈出了关键一步. 紧跟这次RC1的发布,我们成功地将 ...

  2. ADO.NET访问SQL Server调用存储过程带回参

    1,ADO.NET访问SQL Server调用存储过程带回参 2,DatabaseDesign  use northwind go --存储过程1 --插入一条商品 productname=芹菜 un ...

  3. 使用ADO.NET对SQL Server数据库进行訪问

    在上一篇博客中我们给大家简介了一下VB.NET语言的一些情况,至于理论知识的学习我们能够利用VB的知识体系为基础.再将面向对象程序设计语言的知识进行融合便可进行编程实战. 假设我们须要訪问一个企业关系 ...

  4. Python3.7.1学习(八) Python访问SQL Server数据库

    一.pip install pymssql即可安装pymssql库 二.Python连接SQL Server数据库     实例代码如下: # -*- coding:utf-8 -*-"&q ...

  5. java 访问sql server数据库

    控制面板--管理工具—ODBC数据源(64位)--系统DNS—添加(名称为“test”,服务器填“.”描述随意) 这里访问的数据库为AdventuerWorks 数据源配置好后可以测试一下,下面是ja ...

  6. 多实例设置本地IP访问sql server 数据库

    我们本地有时候有多个数据库版本(^_^..别说了都是泪),都是为了兼容不同版本的数据而安装的! 最近我们需要用IP来访问,就有了这一段折腾的历程. 上图片为我安装的三个不同的版本,一个为sql ser ...

  7. python 访问sql server数据库

    访问数据库 cnxn = pyodbc.connect("Driver={SQL Server};Server=localhost;Database=用户名;uid=sa;pwd=密码&qu ...

  8. [转载]C#中使用ADO.NET连接SQL Server数据库,自动增长字段用作主键,处理事务时的基本方法

    问题描述: 假设在数据库中存在以下两张数据表: User表,存放用户的基本信息,基本结构如下所示:   类型 说明 ID_User int 自动增长字段,用作该表的主键 UserName varcha ...

  9. 使用Dapper访问SQL Server数据库

    对应Demo程序名:DapperDemo 准备工作:为项目安装Dapper类库 方法一:项目中添加:项目名右键:Manage NuGet Packages:搜索Dappe:点击安装 方法二:在NuGe ...

随机推荐

  1. Centos7+httpd+fastcgi安装提示错误

    搭建的环境: centos7 Apache/2.4.6 fastcgi2.4.6 rails4 在安装fastcgi的时候遇到了问题: 问题: ...... In file included from ...

  2. Android在layout xml中使用include完成静态加载

    Android在layout xml中使用include完成静态加载 include静态加载:不仅可以加载布局,还可以加载控件(控件标签名要在最外层)include标签中有个layout属性就是专门用 ...

  3. 2017-02-20 注册.Net Framework4.0

    在使用IIS发布Web应用程序时,有时会遇到Asp.Net 4.0尚未在Web服务器上注册的问题,需要手动注册下.Net Framework 4.0. 注册.net Framwork4.0 步骤,以w ...

  4. WPF绑定数据源之RelativeSource

    Command="{Binding ConfirmRegisterCommand}" CommandParameter="{Binding RelativeSource= ...

  5. Nodejs+MongoDB+Bootstrap+esj搭建的个人简易博客

    github:https://github.com/yehuimmd/myNodeBloy Nodejs+MongoDB+jQuery+Bootstrap-esj搭建的个人简易博客 主要功能 前台 : ...

  6. Office 2016 (Preview)

    Office 2016 Preview for MAC (预览版) https://products.office.com/zh-CN/mac/mac-preview 安装下载:http://go.m ...

  7. Python学习之路day3-函数

    一.函数基础 编程方法典型的编程方法有面向过程.面向对象和函数式编程.面向过程是把编程的重点放在实现过程上,分析出结局问题所需的步骤过程,然后通过语句来一一定义实现.面向对象是把构成问题的事务分界成若 ...

  8. Redis中redis.conf配置总结

    redis.conf 配置项说明如下:1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程  daemonize no2. 当Redis以守护进程方式运行时,Re ...

  9. JS循环遍历JSON数据的方法

    JSON数据如:{"options":"[{/"text/":/"王家湾/",/"value/":/" ...

  10. nyoj-67-三角形面积(S=(1/2)*(x1y2+x2y3+x3y1-x1y3-x2y1-x3y2))

    题目链接 /* Name:nyoj-67-三角形面积 Copyright: Author: Date: 2018/4/26 16:44:47 Description: 三角形的三个顶点坐标求其面积的公 ...