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(); } }
  • 相关阅读:
    Windows XP下 Android开发环境 搭建
    Android程序的入口点
    在eclipse里 新建android项目时 提示找不到proguard.cfg
    64位WIN7系统 下 搭建Android开发环境
    在eclipse里 新建android项目时 提示找不到proguard.cfg
    This Android SDK requires Android Developer Toolkit version 20.0.0 or above
    This Android SDK requires Android Developer Toolkit version 20.0.0 or above
    Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead
    Windows XP下 Android开发环境 搭建
    Android程序的入口点
  • 原文地址:https://www.cnblogs.com/qiuguochao/p/6886300.html
Copyright © 2011-2022 走看看