• ADO.NET


    微软专门封装了一套与各种数据库交互的类库,就是ADO.NET
      ADO.NET不光能和SQLSERVER交互,还可以与多种主流数据库交互,如Oracle,MySql,Assess等

    常用类:
      SqlConnection 用来连接数据库 
      SqlCommand  用来执行SQl语句,增删改查等
      SqlDataReader 数据读取器,负责对数据库执行命令,用来读取数据库,每次读一行,只能往前读
      SqlDateAdapter 数据适配器,负责数据集与数据库的联系,一次读取整个结果集,需要将读取的数据库放入数据集中
      DateSet     数据集,负责对数据执行命令,相当于一个临时仓库
     
      SqlConnectionStringBuilder  自动生成连接字符串
      SqlParamter   带参数的SQL语句
      SqlTransaction  ADO.NET中的事务

    与DateSet相关的类:
      DataVIew DataRowView
      DataTable DataRow DataColumn
      DataRealation //DataTable之间的关系   Constrain //约束

    ADO.NET中的连接资源都实现了IDispose()接口,可以用using来管理资源

    连接池:
      第一次创建连接通道时,会实例化一个连接对象,使用后会放入连接池中,之后,若再创建使用相同连接字符串的连接对象时,则会直接从连接池中取出,不会再实例化一个新的连接对象
      pooling = true; //启用连接池
      SqlConnection.ClearAllPools();    //清除所有连接池
      SqlConnection.ClearPool();

    SqlConnection类:连接数据库
      1.创建连接对象
      SqlConnection conn = new SqlConnection();
      conn.ConnectionString = @"Data Source=.\sqlexpress;Initial Catalog=heima;uid = sa;pwd = 123456";  //指定连接字符串(连到哪儿去)
       2.打开数据库连接
      conn.Open(); //打开连接
      conn.State; // 获取数据库连接状态
      3.关闭数据数据库连接
      conn.Close(); //关闭连接
      conn.Dispose(); //释放资源,包含Close()方法

      在WinForm中添加配置文件:
        1.添加配置文件 App.config
        2.在配置文件中添加连接字符串:
        <connectionStrings>
          <add name="strConn" connectiongString="server=.\sqlexpress;database =HeiMaBlog'; uid=sa; pwd=123456">
        </connectionStrings>
        3.在项目中 添加引用 ->.Net选项卡 -> System.Configuration

      若使用附加数据库需在Main()函数中加入以下代码:
      string dataDir = AppDomain.CurrentDomain.BaseDirectory;  //获取当前应用程序域的基目录
        if(dataDir.EndsWith(@"\bin\Debug\") || dataDir.EndsWith(@"\bin\Release\"))
        {
          dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;
          AppDomain.CurrentDomain.SetData("DataDirectory", dataDir);
        }

        //连接字符串一  //pooling=ture; 添加到连接池
    string strConn = @"server=.\sqlexpress;database = Person;uid = sa;pwd = 123456;pooling=ture";//密码验证
    string strConn = @"server=.\sqlexpress;database = Person;integrated security=ture"; //Windows身份验证

    //连接字符串二
    string strConn = @"Data Source=.\sqlexpress;Initial Catalog=ItcastSIM;Integrated Security=True";
    SqlConnectionStringBuilder cb = new SqlConnectionStringBuilder(); //连接字符串创建类
    cb.DataSource = ".\\sqlexpress";
    cb.InitialCatalog = "Person";
    cb.IntegratedSecurity = true;
    cb.Pooling = true;
    string strConn = cb.ToString();

    //附加数据库连接字符串
    string strConn = @"Data Source=.\SQLEXPRESS; AttachDBFilename=|DataDirectory|\db1.mdf; Integrated Security=True; User Instance=True";

    //从配置文件获取连接字符串
    string strConn = ConfigurationManager.ConnectionStrings["strConn"].ConnectionString;

    //创建连接对象 conn
    SqlConnection conn = new SqlConnection(strConn);
    conn.Open(); //打开连接
    Console.WriteLine("连接成功");
    conn.Dispose();

    SqlCommand类:创建并执行SQL语句
      SqlCommand cmd = new SqlCommand();  //创建命令对象
      cmd.Connection = conn;    //指定连接通道
      cmd.CommandText = "select count(*) from Test"; //指定SQL命令
      object o = cmd.ExecuteScalar();  //执行SQL命令
     SqlCommand常用的三个方法:
      cmd.ExecuteNonQuery();  //执行非查询命令,即插入,更新,删除等,并返回受影响的行数
      cmd.ExecuteReader(); //返回SqlDateReader对象
      cmd.ExecuteScalar();  //执行查询,并返回结果集的第一行第一列,其内部也是调用了ExecuteReader()方法

        //创建SQL命令类,用using释放资源
    using (SqlCommand cmd = conn.CreateCommand())
    {
    //所要执行的SQL语句
    cmd.CommandText = "Insert into T_Users(UserName,Password) values('admin','888888')";
    cmd.ExecuteNonQuery(); //可返回受影响的行数

    //在values关键词前加上output inserted.ID,可以得到插入的自动增长ID的值
    cmd.CommandText = "Insert into T_Users(UserName,Password) output inserted.ID values('admin','888888')";
    int i = Convert.ToInt32(cmd.ExecuteScalar());
    }

    SqlDataReader类:数据读取器
      SqlDataReader reader = cmd.ExecuteReader(); //创建SqlDateReader对象(必须通过ExecuteReader()来赋值,因为SqlDataReader的构造函数是私有的)
      while(reader.Read())  //Read()方法向前逐行读取数据,读完返回false
      {
        string id = reader[0].ToString();//获得当前读取行的第一列
        string id = reader["id"].ToString();//通过列名读取
        string id = reader.GetString(0); //只能通过序号访问
        string id = reader.GetString(reader.GetOrdinal("ID"));
      }
      dr.close(); //关闭读取器
      reader.HasRows; //返回一个BOOL值,用于判断结果集中是否有数据
      int i = reader.GetOrdianl("列名");  //通过列名获取其下标
      GetInt32(序号) GetString(序号) 返回指定序号(下标)的值
      reader.IsDbNull(下标); //用来判断reader[1]是否为null,反回bool值
      SqlDataReader必须独享一个数据库连接,因为SqlDataReader结果集是缓存在数据库端的,并没有在本地服务器中,所以需要保持连接,一次一次的去读

        using(qlCommand cmd = conn.CreateCommand())
    {
    cmd.CommandText = "Select * from T_Users";
    //创建SQL读取器
    using(SqlDataReader reader = cmd.ExecuteReader())
    {
    while(reader.Read())
    {
    Console.WriteLine(reader.GetString(reader.GetOrdinal(UserName));
    }
    }
    }

    cmd.StatementCompleted 事件 每条语句执行完后触发
    多条SQL语句同时执行,中间需要用分号隔开

    参数化查询:
      @UserName 表示此处用参数代替, 不会在C#中进行替换,而是在SQLServer中直接用参数的值进行数据比较,因此不会有注入漏洞攻击
      cmd.CommandText = "select * from T_Users where UserName = @UserName";
      cmd.Parameters.Add(new SqlParameter("UserName","admin"));
      cmd.Parameters.Add(new SqlParameter("ID","(object)1")); 此处需要使用数据类型转换,避免被当成枚举值使用 

    DataDet 数据集
      DataSet是数据的集合,临时数据库,内存数据库.

        //创建数据集对象
    DataDet ds = new DataSet();
    //创建数据表
    DataTable dt = new DataTable();
    //装数据表添加到数据集的表集合中
    ds.Tables.Add(dt)
    //创建数据列
    DataColumn col = new DataColmun("id",typeof(int));
    col.AllowDBNull = false; //不允许为空
    col.AutoIncrement = true; //设置为自增长列
    col.AutoIncrementSeed = 1; //设置种子初始值
    col.AutoINcrementStep = 1; //设置种子增长值
    DataColumn col1 = new DataColumn("name",typeof(string));
    //为数据集中的表添加列
    dt.Columns.Add(col);
    dt.Columns.Add(col1);
    //创建数据行
    DataRow row = dt.NewRow();
    row[1] = "Tom";
    //为数据集添加行
    dt.Rows.Add(dr1);
    //遍历数据集中内容
    StringBuilder sb = new StringBuidler();
    foreach(DataTable table in ds.Tables)
    {
    sb.AppendLine("表名" + table.TableName);
    foreach(DataRow dr in table.Rows)
    {
    for(int i = 0; i<dr.Table.Columns.Count; i++)
    {
    sb.Append(""+(i+1)+"列:"+dr[i]);
    }
    sb.AppendLine();
    }
    }

      SqlDataAdapter用于填充数据集
      SqlDataAdapter内部其实还是使用了SqlDataReader去读取数 据的,只不过封装起来了,通过DataAdapter也可以实现分页,只是并不高效,因为Adapter是到数据库执行SQL语句,然后存入到数据库缓存 中,再从中截取数据,而真正的分页是在数据库查询的时只查询对应页的行,而不是查询所有的行
      DataSet ds = new DataSet();  //创建数据集
      SqlDataAdapter da = new SqlDataAdapter(cmd); //创建数据适配器
      da.Fill(ds);  //填充数据集
      da.Fill(ds,0,10,"tempTable"); //从第零条读取10条记录

        DataSet dataSet = new DataSet();  //创建数据集
    string connStr = ConfigurationManager.ConnectionStrings["connstr"].ConnectiongString; //获取数据库连接字符串
    using(SqlConnection conn = new Sqlconnection(connStr)) // 连接数据库
    {
    conn.Opne();
    using(SqlCommand cmd = conn.CreateCommand()) //创建命令对象
    {
    cmd.CommandText = "Select * From TableName" //写入命令
    DataSet dataset = new DateSet(); // 声明数据集
    SqlDataAdapter adapter = new SqlDataAdapter(cmd); //创建数据集适配器
    adapter.Full(dataSet); //装数据填充到数据集中
    }
    }
    DataTable table = dataSet.Tables[0]; //获取数据集中的表
    for (int i = 0; i < table.Rows.Count; i++)
    {
    DataRow row = table.Rows[i]; //获取数据集中的行
    string name = Convert.ToString(row["UserName"]); //获取行中的字段
    string age = Convert.ToString(row["Age"]);
    }

      更新数据集: Update() 使用SqlConnectionBuilder SQL命令生成助手自动生成Command 
        SqlConnectionBuilder要求表必须有主键,通过DataRow的RowState可以获得行的状态,调用DateSet的GetChange()方法得到变化的结果集,降低传递的资源占用
        SqlCommandBuilder scb = new SqlCommandBuilder(da); //创建SQL命令
        da.Update(ds,"tempTable");  //执行SQL命令

  • 相关阅读:
    python迭代器
    初识html
    跨域(jsonp)方法
    闭包
    pycharm软件配置
    插槽slot
    git常用操作
    在mac中使用Charles抓包操作
    防止网页被嵌入框架
    H5唤起APP
  • 原文地址:https://www.cnblogs.com/guozhe/p/2397853.html
Copyright © 2020-2023  润新知