日期:2011-05-28  浏览次数:20433 次

这段时间一直在学习C#winform中的数据库编程,一直没有搞清楚怎么样进行数据库的更新操作,只是知道简单的查看数据库,哎,旁边没有人学.net的好痛苦呀,什么事情都只能自己弄,连一个人讨论的都没有,还好在网上认识一个兄弟,有什么问题还可以问他。现在弄清楚了其中一种最简单的数据库的添加与更新方法。

今天终于弄清楚了怎么样用DataSet对数据库进行更新了,总结如下:

要操作DataSet进行数据库的添加,更新和删除,必须弄清楚几个类:SqlDataAdapter类,SqlCommandBuilder类等等。

*SqlDataAdapter类:表示用于填充 DataSet 和更新 SQL Server 数据库的一组数据命令和一个数据库连接。DataSet 和 SQL Server 之间的桥接器,用于检索和保存数据。SqlDataAdapter 通过对数据源使用适当的 Transact-SQL 语句映射 Fill(它可更改 DataSet 中的数据以匹配数据源中的数据)和 Update(它可更改数据源中的数据以匹配 DataSet 中的数据)来提供这一桥接。其实通俗点来讲,这个类的作用就是将数据库中的数据捆绑到DataSet中,然后对DataSet进行操作。而DataSet可以看成是数据库中找出的几个表在内存中临时存放的地方。它不需要一直和数据库建立连接,这样可以保证服务器不会受很大的负担,因为SqlDataAdapter类中的Fill方法有很好的特性:如果没有使用conn.open(),那么fill()语句执行时会打开conn,然后使用完了以后关闭conn,如果我使用了conn.open()那么,fill()语句执行以后也不会关闭连接,因为可能有其他的语句需要在连接的情况下执行,此时需要手工关闭连接.对DataSet中表的修改也就是对数据库中表的修改,但是还是要有特定的命令SqlCommandBuilder。

*SqlCommandBuilder类:自动生成具有以下用途的单表命令:使对 DataSet 所做的更改与关联的 SQL Server 数据库相协调。SqlDataAdapter 不会自动生成实现 DataSet 的更改与关联的 SQL Server 实例之间的协调所需的 Transact-SQL 语句。但是,如果设置了 SqlDataAdapter 的 SelectCommand 属性,则可以创建一个 SqlCommandBuilder 对象来自动生成用于单表更新的 Transact-SQL 语句。然后,SqlCommandBuilder 将生成其他任何未设置的 Transact-SQL 语句。一旦设置 DataAdapter 属性,SqlCommandBuilder 就将其自身注册为 RowUpdating 事件的侦听器。一次只能将一个 SqlDataAdapter 与一个 SqlCommandBuilder 对象(或相反)互相关联。为了生成 INSERT、UPDATE 或 DELETE 语句,SqlCommandBuilder 会自动使用 SelectCommand 属性来检索所需的元数据集。如果在检索元数据后(例如在第一次更新后)更改 SelectCommand,则应调用 RefreshSchema 方法来更新元数据。SqlCommandBuilder 还使用由 SelectCommand 引用的 Connection、CommandTimeout 和 Transaction 属性。如果修改了任何这些属性或者替换了 SelectCommand 本身,用户则应调用 RefreshSchema。否则,InsertCommand、UpdateCommand 和 DeleteCommand 属性将保留它们以前的值。如果调用 Dispose,则会解除 SqlCommandBuilder 与 SqlDataAdapter 的关联,并且不再使用所生成的命令。使用SqlCommandBuilder这个类的时候一定要注意,必须保证所操作的数据库表中一定要存在主键,否则不会自动生成命令,而且会产生异常。

实例代码:

 string str="server=localhost;uid=sa;pwd=;database=test";
   SqlConnection conn=new SqlConnection(str);
   SqlDataAdapter adapter=new SqlDataAdapter("select * from stores",conn);
   //adapter.SelectCommand=new SqlCommand("select * from stores",conn);
   SqlCommandBuilder scb=new SqlCommandBuilder(adapter);//自动产生各种命令
   conn.Open();
   DataSet ds=new DataSet();
   adapter.Fill(ds,"stores");
   conn.Close();
   //Console.WriteLine(ds.Tables["stores"].Rows[0][0].ToString());
   //ds.Tables["stores"].Rows[0][0]="1234";
   DataTable dt=ds.Tables["stores"];
  

 //DataRow myrow=dt.NewRow();//在表中添加新的行,一定是这样的。
  myrow["stor_id"]=8345;
   myrow["stor_name"]="king";
   myrow["stor_address"]="hazu";
   myrow["city"]="wuhan";
   myrow["state"]="ab";
   myrow["zip"]="12345";
   dt.Rows.Add(myrow);  //ds.Tables["stores"].Rows.Add(myrow);//这样也可以

//dt.Rows.Add(new object[]{"0101","sha","hazu","wuhan","bc","1532"});  //或者是直接用这句话来添加一行,上面的属性列的付直可以不用。

 
   adapter.Update(ds,"stores");
   Console.WriteLine("修改成功");
   Console.Read();

以上是添加一行的代码,对于其他的,如:修改其中的一行,删除等等,都可以这样,只要存在SqlCommandBuilder就会自动生成相应的Command命令的。

还有一种修改数据库中信息的方法,那就是过程存储,明天开始研究,呵呵,好累,现在准备考研究生没有什么时间学c#好郁闷。但是还是不舍得完全的放弃,还是有节制的学吧。