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;
          }
      }
      
  • 相关阅读:
    03_ if 练习 _ little2big
    uva 11275 3D Triangles
    uva 12296 Pieces and Discs
    uvalive 3218 Find the Border
    uvalive 2797 Monster Trap
    uvalive 4992 Jungle Outpost
    uva 2218 Triathlon
    uvalive 3890 Most Distant Point from the Sea
    uvalive 4728 Squares
    uva 10256 The Great Divide
  • 原文地址:https://www.cnblogs.com/ye-hcj/p/8191284.html
Copyright © 2011-2022 走看看