这段时间一直在学习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#好郁闷。但是还是不舍得完全的放弃,还是有节制的学吧。
新闻热点
疑难解答