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();
   }
}
时间: 2024-12-16 21:27:02

ADO.NET的学习的相关文章

ADO.NET详细学习笔记

[1]ADO.NET和ADO的区别: ADO以Recordset存储,而ADO.NET则以DataSet表示.Recordset看起来更像单表,如果让Recordset以多表的方式表示就必须在SQL中进行多表连接.反之,DataSet可以是多个表的集合.ADO 的运作是一种在线方式,这意味着不论是浏览或更新数据都必须是实时的.ADO.NET则使用离线方式,在访问数据的时候ADO.NET会利用XML制作数据的一份幅本,ADO.NET的数据库连接也只有在这段时间需要在线. 由于ADO使用COM技术,

ADO.NET初学习

①System.Data  → DataTable,DataSet,DataRow,DataColumn,DataRelation,Constraint,DataColumnMapping,DataTableMapping②System.Data.Coummon     → 各种数据访问类的基类和接口③System.Data.SqlClient   → 对Sql Server进行操作的数据访问类  主要有:   a) SqlConnection            → 数据库连接器      

ADO.NET(课程学习内容)

1.ADO.NET概述 ·什么是ADO.NET? ADO.NET是一种访问数据库的技术,是.NET 托管应用程序的数据库API 位于System.Data及其子命名空间中的类型集合,用来在.NET平台内访问和处理数据库中的数据 ADO革命性的.更可靠的继承者 为基于Web的无连接环境而设计 得到了高级XML支持的编程模型 ·ADO.NET对象模型 ·已连接环境 1.在已连接环境中,用户可以经常连接到数据源 2.优点 更安全.更容易维护 更容易控制并发性 与非连接环境比较,数据刷新更及时 3.缺点

【笔记】ADO.NET基础学习

数据库和VS的连接,实现数据的同步,让用户的一切信息都可以在数据库中留下记录. ADO.NET基础      它是连接所有数据库的一种特殊的技术,提供对不同的数据库统一操作接口. 在VS中也可以添加数据库,也可以在其中使用SQL语句,不需要在sql数据库中创建,这样用起来就特别方便,便于数据库的快速读取.<基于服务的数据库>        在VS中创建的mdf和数据库中的一样,它跟随着项目走,用起来方便运行时会自动附加(Attach).打包时首先关闭mdf与数据库的连接,才行. {ado.ne

ADO.NET基础学习

(记录下方便自己复习) 概念 简单地理解为用来连接数据库的类. 工作流程 ①Connection对象用来连接数据库. 两种连接方式:Windows身份验证 / sqlserver验证 private void button1_Click(object sender, EventArgs e) { try { //string Str = "server=.;Initial catalog="db_PWMS";integrated security=SSPI";//w

ADO.NET基础巩固-----连接类和非连接类

      最近的一段时间自己的状态还是不错的,早上,跑步,上自习看书,下午宿舍里面编程实战,晚上要么练习代码,要么去打球(在不打就没机会了),生活还是挺丰富的. 关于C#的基础回顾就先到前面哪里,这些要自己在工作中慢慢的去体会,不是说看书就可以掌握的.我们都是从学生时代过来的知道每个人的学习情况是不一样的,所以找到自己的学习节奏是最好不过的. 下面是关于访问数据库[ADO.NET]的学习,之前刚开始学习的时候把这些基本的都过了一遍,但是长时间不使用,一些基本的用法还是会遗忘的.     一:关

ADO.NET之初步了解

重构的时候就接触过ADO.NET,新闻发布系统的时候遇到了sqlhelp.学习ASP.NET的时候,老师又很详细的讲了.现在总结一下. 简介: 首先,ADO.NET提供了对sql server等数据库的访问.应用程序可以通过ADO.NET连接到数据库,并检索.操作.更新其中的数据.同时他是一组向.net编程人员公开数据访问服务的类.ADO.NET提供了对关系数据.XML和应用程序数据的访问,所以是.NET Framework不可或缺的一部分. ADO.NET组件将数据访问和数据处理分离,他是通过

勇敢前进

今天又是我们上课需要停留片刻的尾声啦,顿时不知道该讲些什么啦,总起来讲,我们这周学习啦SQL Server语言以及ADO.net,学习啦这个也就意味着我们可以做些小程序啦,嘿嘿,我知道我现在做出来的程序还是错误居多,而且最重要的是一点都不严谨,我也不给自己找理由啦,还是自己练习的项目太少啦,接下来我们就会要项目啦,我想我会认真去做练习的,经过最近的程序发现我是很粗心啊,每次只要发生错误,都是没有自己解决啊,我感觉我能够帮其他的人找错,可是自己的错误却是难以发现啊,这是我现在最需要解决的问题啦,嘿

三阶段总结

转眼三个月过去了.一切都是过得那么快.从当初的对软件开发的一窍不通到现在自己写代码开发.大家从当初的陌生当现在一起写代码开发.中间经历了太多,有喜也有忧.  三个月月学到了很多,一阶段的HTML  CSS JS 二阶段的c#  SQLSERVER数据库   Winorm的开发  对软件开发也有了大致的了解 (UI界面 后台逻辑 数据库)还有接下来醉醉重要的三阶段ADO.NET的学习.  在每个阶段结束后都要根据所学的内容做相应的项目.虽然在做项目的过程中写代码世间非常非常无趣的事情.但是在写完代