zoukankan      html  css  js  c++  java
  • ADO.NET的整理

     ADO.NET的几个对象

    • Connection:管理数据库的连接
    • Command:对数据库执行命令
    • DataReader:数据流读取器,返回的数据都是快速的且只是“向前”的数据流。无法实例化,只能通过Command创建
    • DateSet:缓存数据,对数据进行操作
    • DataAdapter:数据适配器,数据库和DataSet的桥梁

    ADO.NET命名空间

     注:图取自网络

    常见的是SQL数据源

    引用命名空间:

    using System.Data.SqlClient;

    一、Connection类

    连接数据库,Connection会被Command对象使用,这样就能够知道是在哪个数据源上面执行命令。

    Connection有两个重要属性:ConnectionString和State,连接字符串和连接状态

           两个重要方法:Open()和Close(),用来打开和关闭数据库连接

    using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind"))    
    {        
        conn.Open();       
    }

     conn.State.ToString():当前连接状态,返回值为Closed 或Open

    二、Command对象

    Command有两个重要属性:CommandType, 指明CommandText 是SQL语句,存储过程还是表操作,默认值为CommandType.Text; 

                                                        两个值:(1)CommandType.StoredProcedure,以存储过程方式执行

                               (2)CommandType.Text SQL语句执行

                               (3)CommandType.TableDirect,直接处理某个表

                   CommandText,值为SQL语句或是存储过程名称,默认为SQL语句

    创建命令对象的两种方式

    using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind"))    
    {        
        conn.Open();   
        SqlCommand SqlCommand= conn .CreateCommand(); //这种方式比较好
    SqlCommand.CommandText="select * from Student"; //或是实例化一个对象 //SqlCommand sqlcmd=new SqlCommand(); //sqlcmd.CommandText ="select * from student"; //sqlcmd.Connection=conn;
    }

    三个重要方法:

    • ExecuteReader():返回DataReader对象,DataReader对象说明详见下文
    using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind"))    
    {        
         SqlCommand command = conn.CreateCommand();
       command.CommandText = "Select * form Student";
       //CommandBehavior.CloseConnetion 关闭dataReader时,同时也把与它相关联的Connection连接也一起关闭   
    using (SqlDataReader dr = command.ExecuteReader(CommandBehavior.CloseConnection))   {     while (dr.Read())     {       //开始读取数据了,接下来你想怎么样就怎么样了       string str = dr.GetSqlString(0).ToString();     }   } }
    using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind"))    
    {        
        SqlConnection conn = new SqlConnection(str);        //创建连接
        SqlCommand cmd = conn.CreateCommand();              //创建命令
        cmd.CommandText = "SELECT * FROM Person";           //设置操作语句
        conn.Open();                                        //打开连接
        //SqlDataReader读取数据
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
          while (reader.Read())
            {
                   Console.WriteLine(reader[0] + ":" + reader[1]);  //输出当前行的第一列,第二列数据
            }
        }
    
        cmd.CommandText = "SELECT Count(*) FROM Person";
        object obj = cmd.ExecuteScalar();                   //仅查询第一行第一列
        Console.WriteLine((int)obj);
        conn.Close();                                       //关闭连接
                 
    }
    • ExecuteScalar():返回数据第一行第一列的值,如Count(*),如果没有数据,则返回NULL
    • ExecuteNonQuery():返回增、删、改的影响行数
    using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind"))    
    {         
        SqlCommand cmd = conn.CreateCommand();              //创建命令
        cmd.CommandText = "Update Person Set PersonName = 'Ado.net修改' WHERE PersonId = @Id";    //设置操作语句
        cmd.Parameters.Add("@Id", SqlDbType.Int);           //添加参数,说明类型
        cmd.Parameters["@Id"].Value = 1;                    //设置参数值
        conn.Open();                                        //打开连接
        int i = cmd.ExecuteNonQuery();                      //执行命令,ExecuteNonQuery由名称看出,只能用于非查询语句
        conn.Close();                                       //关闭连接
        Console.WriteLine(i);                               //输出影响行数

      //直接使用参数集合添加你需要的参数,推荐这种写法
      //SqlParameter[] parameters = new SqlParameter[]
      //{
        //new SqlParameter("@name",SqlDbType.NVarChar,100){Value = "yang"},
        //new SqlParameter("@age",SqlDbType.Int,2){Value = 888},
        //new SqlParameter("@address",SqlDbType.NVarChar,20){Value = "Jiang Su"}, 
      //};
      //ommand.Parameters.AddRange(parameters);
    }

     三、DataReader类

    常见方法:

    (1)Read()返回Bool,是否还有下一行,并移到结果集的下一行

    (2)GetOrdinal(string 列名),返回序列号,通过列名来获取当前列的索引号,这样如果下次你列名顺序发生变化也没有关系

    (3)GetName(int 序列号):  获取列名,参数为指定列名的序列号,返回string

    int nameId= dr.GetOrdinal("name");
    string columnName = dr.GetName(nameId);
    //知道列名获取值
    using (SqlDataReader reader = cmd.ExecuteReader())
    {
       while (reader.Read())
         {
            Console.WriteLine(reader.GetString(sdr.GetOrdinal("name"))); 
       } 
    }

    (4)NextResult(),当查询为批处理查询时,使用这个方法去读取下一个结果集,返回值为Bool,如果存在多个结果集,则为 true;否则为 false

    using (SqlConnection conn = new SqlConnection(strConnString))
    {    conn.Open();   
    using (SqlCommand cmd = new SqlCommand())
       {      cmd.Connection
    = conn;      // 利用分号「;」串连多句 SQL 语句,之后再一次丢进数据库去执行,达成「批次」读取或更新      // 数据库的目的。此技巧亦适用于 INSERT、UPDATE、DELETE 的「批次」执行。      cmd.CommandText = "SELECT 字段1,字段2 FROM 数据表1 ; SELECT * FROM 数据表2";      using (SqlDataReader dr = cmd.ExecuteReader())
         {       
    while(dr.Read())
           {          
    this.DropDownList1.Items.Add(dr.GetSqlString(0).ToString() + dr.GetSqlInt32(1).ToString());        }     dr.NextResult();      while(dr.Read())
        {          
    this.DropDownList2.Items.Add(dr.GetString(0) + dr.GetInt32(1));       }     }   } }

    四、SqlDataAdapter 数据适配器

    有四个重载

    无参
    SqlDataAdapter(SqlCommand)          // 执行命令对象实例
    SqlDataAdapter(String, SqlConnection)   //只能指定查询语句 ②连接对象实例
    SqlDataAdapter(String, ConnectionString)// 用 SelectCommand 和一个连接字符串初始化 SqlDataAdapter 类的一个新实例

    一个重要方法:Fill(),数据填充至DataSet

    using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind"))    
    {      
      DataSet dataSet = new DataSet();  
        conn.Open();
        SqlCommand command = conn.CreateCommand();
        command.CommandText = "select name,age,address from MyInformation";
        SqlDataAdapter dataAdapter = new SqlDataAdapter(command);
        dataAdapter.Fill(dataSet);  //填充数据
    }

    对数据进行增加操作

    using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind"))    
    {        
        using (SqlConnection conn = new SqlConnection(ConnectionString()))
     {
         conn.Open();
         //构建查询语句,也可以指定SqlCommand,其中变换的方法有很多
         SqlDataAdapter da = new SqlDataAdapter("select LastName,FirstName from dbo.Employees", conn);
         DataSet ds = new DataSet();
         da.Fill(ds);
         //这句话很重要,它会把你在DataSet增加的数据转化为SQL语句用来更新数据库
         SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(da);
         //添加行,实例化一个行对象,注意是用NewRow来创建行
         DataRow row = ds.Tables[0].NewRow();
         row[0] = "Yang";
         row[1] = "鬼头";
         ds.Tables[0].Rows.Add(row);  //添加到表中
         da.Update(ds);             //把DataSet中表和数据库进行对比,更新
     }     
    }

    更新操作

    using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind"))    
    {        
        using (SqlConnection conn = new SqlConnection(""))
    {
        SqlDataAdapter da = new SqlDataAdapter("SQL语句或你自己定义的命令对象", conn);
        DataSet ds = new DataSet();
        da.Fill(ds);
        //很重要的一句话
        SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(da);
        ds.Tables[0].Rows[12][1] = ""; //修改数据
        da.Update(ds);
        //调用Update方法其中隐式的调用了AcceptChanges方法,更新数据集中的数据
        //如果你继续使用这个数据集而没有调用这个方法,在后面的使用会出现异常
        ds.AcceptChanges();  //这句话可以不写的
    }  
    }

    最后

    对于一些增删改,都应加上事务,防止出错能回滚数据

    using (SqlConnection conn = newSqlConnection("DataSource(local);Integrated Security=SSPI;Initial Catalog=Northwind"))    
    {    //事务
         SqlTransaction myTran = con.BeginTransaction(); 
        tyr
       {
            //正常代码执行  
             ..............
    //提交事务 myTran.Commit(); }
    catch(Exception e) { //出错,事务回滚 myTran.Rollback(); } }
  • 相关阅读:
    Django开发笔记一
    Netty+SpringBoot写一个基于Http协议的文件服务器
    SQL优化
    mysql 字符串数字转换
    git 常用的命令总结
    eclipse 使用Maven deploy命令部署构建到Nexus
    intellij idea远程debug调试resin4教程
    postman 请求种添加用户权限
    对List中每个对象元素按时间顺序排序
    List根据时间字符串排序
  • 原文地址:https://www.cnblogs.com/qiuguochao/p/6886300.html
Copyright © 2011-2022 走看看