SqlCommand和SqlDataAdapter的区别 SqlCommand对应DateReader SqlDataAdapter对应DataSet SqlCommand的执行效率比较高,但不灵活,功能也有限 SqlDataAdapter的效率要低点,它是连接的,可随时更新数据,功能强大。 很多编程用其中一种就可以了。 SqlCommand是C#中与Sql数据库打交道的对象,几乎所有的Sql数据库操作都需要使用该对象来实现,但其功能有限,只是简单的实现了与Sql数据库的接口而已; SqlDataAdapter是一个功能强大的SqL数据适配器,也用于操作Sql数据库,但它的操作都要通过SqlCommand来实现(有一个属性对象的类型就是SqlCommand),也就是说,可以把SqlDataAdapter看作是一个把一些特殊功能封装了、增强了的SqlCommand! adapter是和dataset打交道的,command不能直接与dataset打交道,要通过adapter. adapter的定义是基于command的,当然也可以之间在定义adapter的时候写入sql语句和connection对象 如<BR>dim ada as new sqlclient.sqladapter(select * from stu,conn1)<BR><BR>也可以这么写 dim com1 as new sqlclient.sqlcommand(select * from stu,conn1)<BR> dim ada as new sqlclient.sqladapter(com1)<BR>想要把数据显示出来就不得不用到adapter来给dataset传值,而command不能直接传值给dataset 可以这样理解: DataSet用来装表的集合,里面可以装从SqlDataAdapter中返回的一系列的DataTable 如果返回的有多张表,那么我们可以通过索引的方式来找到想要的表:DataTable dt = ds.Tables[0];或DataTable dt = ds.Tables['products']; DataSet可以直接做为数据控件的数据源,也可以从中获取表或表的视图来做为数据源.如: this.DataList1.DataSource = dt; this.DataList2.DataSource = dt.Tables[0]; this.Datalist3.DataSource = dt.Tables[0].DefaultView; 这三句的效果都是一样的. SqlDataAdapter是针对于SQL数据库的一个数据适配器,对应的还有OledbDataAdapter等等,它起着牵线搭桥的作用,我们可以用它来创建或是执行一个数据库操作命令,并将返回的结果集填充到DataSet中去. SqlDataAdapter对象 一、特点介绍 1、表示用于填充 DataSet 和更新 SQL Server 数据库的一组数据命令和一个数据库连接。 2、在SqlDataAdapter和DataSet之间没有直接连接。当完成SqlDataAdpater.Fill(DataSet)调用后,两个对象之间就没有连接了。 二、使用介绍 1、创建SqlDataAdapter string strSQL=“Select * from Customers”; SqlCommand cmd=new SqlCommand(strSQL,cn); SqlDataAdapter da=new SqlDataAdapter(); da.SelectCommand=cmd; 2、SqlDataAdapter构造函数 ①string strConn=“Provider=.....”; string strSQL=“select * from Customers”; SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn); ②string strConn=“Provider=.....”; SqlConnection cn=new SqlConnection(strConn); SqlDataAdapter da=new SqlDataAdapter(“select * from Customers”,cn); ③string strConn=“Provider=.....”; string strSQL=“select * from Customers”; SqlConnection cn=new SqlConnection(strConn); SqlCommand cmd=new SqlCommand(strSQL,cn); SqlDataAdapter da=new SqlDataAdapter(cmd); 3、从查询中获取结果 ①使用Fill方法 SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn); DataSet ds=new DataSet(); da.Fill(ds); //这里ds中的表名为Table ②使用Fill方法创建DataTable对象和DataColumn对象 SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn); da.TableMapping.Add(“Table”,“Customers”); DataSet ds=new DataSet(); da.Fill(ds); ③使用重载Fill方法 SqlDataAdapter.Fill(DataSet,“Customers”); SqlDataAdapter.Fill(DataTable); SqlDataAdapter.Fill(DataSet,intStartRecord,intNumRecords,“TableName”); ④开放和关闭连接 如果调用了一个SqlDataAdapter对象的Fill方法,而SelectCommand属性的Connection关闭了,那么SqlDataAdapter就会开放一个连接,然后提交查询、获取结果、最后关闭连接。如果在调用前开放了Connection,那么操作之后仍然保持开放。 SqlDataAdapter daCustomers,daOrders; daCustomers=new SqlDataAdapter(“Select * from Customers”,cn); daOrders=new SqlDataAdapter(“Select * from Orders”,cn); DataSet ds=new DataSet(); cn.Open(); daCustomers.Fill(ds); daOrders.Fill(ds); cn.Close(); ⑤多次调用Fill方法 刷新DataSet中的数据,最简单的解决方法就是清空DataSet(或DataTable),然后再次调用DataAdapter对象的Fill方法。 三、属性方法事件介绍 1、属性 ①AcceptChangeDuringFill:确定由DataAdapter所获取的行的RowState(默认为True)。 ②DeleteCommand:获取或设置一个 Transact-SQL 语句或存储过程,以从数据集删除记录。 ③InsertCommand:获取或设置一个 Transact-SQL 语句或存储过程,以在数据源中插入新记录。 ④SelectCommand:获取或设置一个 Transact-SQL 语句或存储过程,用于在数据源中选择记录。 ⑤UpdateCommand:获取或设置一个 Transact-SQL 语句或存储过程,用于更新数据源中的记录。 ⑥TableMappings:SqlDataAdapter用来将查询的结果映射到DataSet的信息集合。 ⑦ContinueUpdate:控制SqlDataAdapter在遇到一个错误之后是否继续提交更改(默认为false)。 2、方法 ①Fill:执行存储于SelectCommand中的查询,并将结果存储在DataTable中。 ②FillSchema:为存储在SelectCommand中存储的查询获取架构信息。获取查询中的各列名称和数据类型。 ③GetFillParameters:为SelectCommand获取一个包含着参数的数组。 ④Update:向数据库提交存储在DataSet(或DataTable、DataRows)中的更改。该方法会返回一个整数值,其中包含着在数据存储中成功更新的行数。 3、事件 ①FillError:当DataAdapter遇到填充DataSet或DataTable的一个错误时,该事件被触发。 ②RowUpdated:向数据库提交一个修改的行之后被触发。 ③RowUpdating:向数据库提交一个修改的行之前被触发。 SqlCommand对象 介绍 SqlCommand对象允许你指定在数据库上执行的操作的类型。比如,你能够对数据库中的行数据执行select,insert,modify以及delete命令。SqlCommand对象能被用来支持断开连接数据管理的情况,但是在这节课我们将只单独使用SqlCommand对象。后面关于SqlDataAdapter的课程将解释如何使用断开数据实现应用程序。这节课将同时展示如何从数据库中返回一个单独的值,比如表中记录的数量。 创建SqlCommand对象 SqlCommand cmd = new SqlCommand('select CategoryName from Categories', conn); 上面一行是典型的实例化SqlCommand对象的代码。它使用一个string参数来保存你想要执行的命令以及一个关于SqlConnection对象的引用。SqlCommand具有重载形式,这些形式你将在以后的示例中看到。 查询数据 当使用SQL的select命令,会得到一组数据集。为了和SqlCommand对象配合使用,你应该使用ExecuteReader方法,它返回一个SqlDataReader对象。我们将在后面的内容讨论SqlDataReader。下面的例子显示了如何使用SqlCommand对象来得到SqlDataReader对象: // 1. Instantiate a new command with a query and connection SqlCommand cmd = new SqlCommand('select CategoryName from Categories', conn); // 2. Call Execute reader to get query results SqlDataReader rdr = cmd.ExecuteReader(); 在上面的示例中,我们通过传递命令字符串核连接对象到构造函数的方式实体化了SqlCommand对象。然后我们通过SqlCommand对象cmd调用ExecuteReader方法得到了SqlDataReader对象。 这些代码是表1中ReadData方法的一部分,我们将在后面集中介绍。 插入数据 要对数据库插入数据,使用SqlCommand对象的ExecuteNonQuery方法。下面的代码显示了如何向数据库表插入数据: string insertString = @'insert into Categories(CategoryName, Description)values ('Miscellaneous', 'Whatever doesn''t fit elsewhere')'; SqlCommand cmd = new SqlCommand(insertString, conn); cmd.ExecuteNonQuery(); SqlCommand的实例化过程与以前看到的有一些区别,但是基本一致。在构造函数的第一个字符串参数中是用的是插入字符串变量而不三字符串字面值。该变量在SqlCommand声明之前被声明了。 注意在insertString文本中“doesn’’t”的两个单引号(’’)。这是将它转义为适当的单引号。 另外一个需要注意的是我们显式指明了列:CategoryName和Description。列表中有一个主键名为CategoryID。我们忽略这列因为SQL Server将自动添加此字段。试图对主键比如CategoryID添加值会产生异常。 为了执行此命令,我们简单的对SqlCommand实体cmd调用ExecuteNonQuery方法。 这段代码是表1中InsertData方法的一部分,我们将在后面集中介绍。 更新数据 ExecuteNonQuery方法同样用来更新数据。下面的代码显示了如何更新数据: string updateString = @'update Categories set CategoryName = 'Other' where CategoryName = 'Miscellaneous''; SqlCommand cmd = new SqlCommand(updateString); cmd.Connection = conn; cmd.ExecuteNonQuery(); 删除数据 你同样能够使用ExecuteNonQuery方法删除数据。下面的例子说明了如何使用EXecuteNonQuery方法删除数据库中的记录。 string deleteString = @'delete from Categories where CategoryName = 'Other''; SqlCommand cmd = new SqlCommand(); cmd.CommandText = deleteString; cmd.Connection = conn; cmd.ExecuteNonQuery(); 这个示例使用了没有参数的SqlCommand构造函数。取而代之的是显式地设置了CommandText和SqlCommand对象的连接属性。 我们同样能够使用SqlCommand构造函数在前面的两个重载形式——用来插入或者更新命令——得到相同的结果。它说明了在任何时候既能够改变命令文本又能够改变连接对象。 ExecuteNonQuery方法调用将命令传递给数据库。 得到单一值 某些时候你想从数据库中只取一个值,它可能是关于数据集的计数、和、平均值或者其他聚合数值。使用ExecuteReader方法并计算代码中的结果并不是做这些事情的有效方式。最好的选择就是让数据库能够执行并且只返回你所需要的单独的值。下面的示例说明了如何使用ExecuteScalar方法来实现: SqlCommand cmd = new SqlCommand('select count(*) from Categories', conn); int count = (int)cmd.ExecuteScalar(); 总结 SqlCommand对象允许你擦许并对数据库传送命令。它含有针对不同的命令而特定的方法。ExecuteReader方法返回SqlDataReader对象来现实查询的结果。对于insert,update以及delete这些SQL命令,使用ExecuteNonQuery方法。如果你只需要查询的单独聚集值,ExecuteScalar方法是最好的选择 SqlDataAdapter和SqlCommand对比分析 一、SqlDataAdapter和DateSet 原理:DateSet是数据的内存驻留表示形式,它提供了独立于数据源的一致关系编程模型;从某种程度上说DateSet就是一个不可视的数据库。但真正与数据源打交道的是 SqlDataAdapter,包括从数据源填充数据集和从数据集更新数据源。SqlDataAdapter使用Fill()方法将检索的数据填充到 DateSet。 流程:IE——GridView——DataSet——SqlDataAdapter——SQL数据库 public void BindGrid() { SqlDataAdapter myAdp = new SqlDataAdapter('select * from UserAdmin order by UserId desc', conn); DataSet ds = new DataSet(); myAdp.Fill(ds, 'Authors'); //Label1.Text = ds.Tables[0].Rows.Count.ToString(); //得到共有多少条记录; GridView1.DataSource = ds.Tables['Authors'].DefaultView; GridView1.DataBind(); } 二、SqlCommand和SqlDataReade 原理:SqlCommand通过ExecuteReader()方法将得到的数据给SqlDataReade对象。 SqlDataReade逐行将从数据源获得的数据放进缓冲区进行处理。 优点:SqlDataReade执行速度快,提高应用程序性能。 优点原因:一旦数据可用,SqlDataReade就会立即检索该数据,而不是等待返回查询的全部结果;默认情况下,一次只在缓冲区存储一行,从而降低系统开销。 缺点:使用不灵活。 流程:IE——SqlDataReade——SqlCommand——SQL数据库 注:每次使用完SqlDataReade对象后一定要调用Close()方法将其关闭。因为SqlDataReade对象以独占的方式使用Connection。 例: SqlCommand myconn = new SqlCommand('select * from v_economy2_comidd where eid=' + Request.QueryString['eid'] + '', conn); conn.Open(); SqlDataReader rd = myconn.ExecuteReader(); rd.Read(); Lbyear1.Text = rd['year1'].ToString(); Lbmonth1.Text = rd['month1'].ToString(); Lbcom_name.Text = rd['com_name'].ToString(); rd.Close(); conn.Close(); 区别在于: SqlDataAdapter: 用于填充 DataSet 和更新 SQL 数据库的“一组”数据命令和“一个”数据库连接。 SqlDataAdapter不但可以操作多个SQL命令,而且还可以操作一个SQL命令 DataSet是关系型数据库的抽象,ADO.NET使用DataAdapter(意为数据适配器)作为dataset和数据源之间的桥梁;DataAdapter 提供了Fill()方法从数据库中获取数据并生成DataSet。 SqlCommand: 对 SQL 数据库执行的“一个”SQL 语句或存储过程。 SqlCommand只能操作一个SQL命令 个人觉得SqlCommand用来更新少量数据时比较合适,速度快,使用方便。他是执行sql语句查询的。 SqlDataAdapter用于把数据放到DataSet中,集中修改、删除后,通过Update把整个DataSet再提交回给数据库进行处理
|