zoukankan      html  css  js  c++  java
  • 原生的ado.net(访问sql server数据库)

    本文介绍原生的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;
          }
      }
      
  • 相关阅读:
    ie8 不能加载dll的问题解决
    Delphi 释放数组中的数据
    CSS: 首字母字体变大时下划线不对齐的解决方法
    谈谈一些有趣的CSS题目(十三)-- 巧妙地制作背景色渐变动画!
    吃透css3之3d属性--perspective和transform
    vue-cli中的webpack配置
    转载 webstrom识别 React语法
    CSS 布局整理(************************************************)
    巧用chrome开发者工具
    详解Webpack2的那些路径
  • 原文地址:https://www.cnblogs.com/ye-hcj/p/8191284.html
Copyright © 2011-2022 走看看