在C#中更新数据库(一)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在C#中更新数据库(⼀)
这段时间⼀直在学习C#winform中的数据库编程,⼀直没有搞清楚怎么样进⾏数据库的更新操作,只是知道简单的查看数据库,哎,旁边没有⼈学.net的好痛苦呀,什么事情都只能⾃⼰弄,连⼀个⼈讨论的都没有,还好在⽹上认识⼀个兄弟,有什么问题还可以问他。
现在弄清楚了其中⼀种最简单的数据库的添加与更新⽅法。
今天终于弄清楚了怎么样⽤DataSet对数据库进⾏更新了,总结如下:
要操作DataSet进⾏数据库的添加,更新和删除,必须弄清楚⼏个类:SqlDataAdapter类,SqlCommandBuilder类等等。
*SqlDataAdapter类:表⽰⽤于填充和更新 SQL Server 数据库的⼀组数据命令和⼀个数据库连接。
和 SQL Server 之间的桥接器,⽤于检索和保存数
据。
SqlDataAdapter通过对数据源使⽤适当的 Transact-SQL 语句映射(它可更改DataSet中的数据以匹配数据源中的数据)和(它可更改数据源中的数据以匹配DataSet中的数据)来提供这⼀桥接。
其实通俗点来讲,这个类的作⽤就是将数据库中的数据捆绑到DataSet中,然后对DataSet进⾏操作。
⽽DataSet可以看成是数据库中找出的⼏个表在内存中临时存放的地⽅。
它不需要⼀直和数据库建⽴连接,这样可以保证服务器不会受很⼤的负担,因为SqlDataAdapter类中的⽅法有很好的特性:如果没有使⽤conn.open(),那么fill()语句执⾏时会打开conn,然后使⽤完了以后关闭conn,如果我使⽤了conn.open()那么,fill()语句执⾏以后也不会关闭连接,因为可能有其他的语句需要在连接的情况下执⾏,此时需要⼿⼯关闭连接.对DataSet中表的修改也就是对数据库中表的修改,但是还是要有特定的命令SqlCommandBuilder。
*SqlCommandBuilder类:⾃动⽣成具有以下⽤途的单表命令:使对所做的更改与关联的 SQL Server 数据库相协调。
不会⾃动⽣成实现的更改与关联的 SQL Server 实例之间的协调所需的 Transact-SQL 语句。
但是,如果设置了 SqlDataAdapter 的属性,则可以创建⼀个 SqlCommandBuilder 对象来⾃动⽣成⽤于单表更新的 Transact-SQL 语句。
然后,SqlCommandBuilder 将⽣成其他任何未设置的 Transact-SQL 语句。
⼀旦设置属性,SqlCommandBuilder 就将其⾃⾝注册为事件的侦听器。
⼀次只能将⼀个 SqlDataAdapter 与⼀个 SqlCommandBuilder 对象(或相反)互相关联。
为了⽣成 INSERT、UPDATE 或 DELETE 语句,SqlCommandBuilder 会⾃动使⽤SelectCommand 属性来检索所需的元数据集。
如果在检索元数据后(例如在第⼀次更新后)更改 SelectCommand,则应调⽤⽅法来更新元数据。
SqlCommandBuilder 还使⽤由 SelectCommand 引⽤的、和属性。
如果修改了任何这些属性或者替换了 SelectCommand 本⾝,⽤户则应调⽤ RefreshSchema。
否则,、和属性将保留它们以前的值。
如果调⽤,则会解除 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#好郁闷。
但是还是不舍得完全的放弃,还是有节制的学吧。