《数据库C#教学课件.docx》由会员分享,可在线阅读,更多相关《数据库C#教学课件.docx(141页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第一讲ADO.NET数据库设计微软公司在开发.NET的同时,对数据访问模型进行了翻天覆地的升级。把原来的AD0模 型升级为全新的ADO.NET数据源。原来最重要的RecordSet现在消失了,取而代之的是DataSet和DataReader,而且不再像 原来RecordSet那样一次只读取一条记录,而是读取整个数据库,然后在内存中建立个映像, 从而实现了断开方式数据库连接和内存管理自动化,这是微软的一个重大的技术突破。DalaSet是和I XML紧密结合的,它也更适合在Internel上使用。所以,尽管我们还可以使用ADO组件进行数据库管理,但是新开发的软件,就应该尽可 能的使用ADO.NET
2、组件。这个以保证新的数据库系统具有更好的性能。下面,我们介绍ADO.NET的一些最重要的知识。一、Connection 对象与ADO相同,Connection对象用于连接数据库,在C#.NET的ToolBox的Data页,有两个 控件与Connection对象有关,它们是:SQLConnection 对于 SQL Server 7.0OleDBConnection 对于其它 OLEDB 连接在Connection对象中一个垂要的属性是:Connectionstring 连接字符串字符串和ADO基本上是相同的,单有下面的例外:需要provider关键字;不支持 URL, Remote proni
3、te, Remote Server 关键字。现在建立一个Windoows工程,把一个OLEDBConnection对象拖进去,我们可以发现,此 时的Connection对象是隐含的,在Form中并不显示来。点Connectionstring属性,像普通的ADO 一样连接数据库。我们可以看到它所生成的字符串:Provider=Microsoft.Jet.OLEDB,4.0;Password=,H,; _User ID=Admin; _Data Source=E:文件教学奖金数据库1 .mdb;Mode=Share Deny None; _Extended Properties=; _Jet OL
4、EDB:System database=,n; _Jet OLEDB:Registry Path;心;_Jet OLEDB:Database Password=H,; _Jet OLEDB:Engine Type=5; _Jet OLEDB:Database Locking Mode=l; _Jet OLEDB:Global Partial Bulk Ops=2; _Jet OLEDB:Global Bulk Transactions=l; _Jet OLEDB:New Database Password:“; _Jet OLEDB:Create System Database=False;
5、_Jet OLEDB:Encrypt Database二False; _Jet OLEDB:Dont Copy Locale on Compact=False; _Jet OLEDB:Compact Without Replica Repair=False; _Jet OLEDB:SFP=False其中真正重要的是前面几段:Provider=Microsoft.Jet.OLEDB.4.0;Password=,M; _User ID=Admin;_Data 5011g=:文件教学奖金数据库l.mdb;.下面是用 SQLConnection 连接 SQLServer 时的 Connectionst
6、ring 字符串:data source=XXX-PE; _initial catalog二奖金数据库;integrated security=SSPI; _persist security info=False; _workstation id=XXX-PE; _ packet size=4096其中,source只是的是计算机名,initial catalog指示的是SQL Server中数据库的名字。二、Command 对象应用Connection对象建立连接以后,可以使用Command对象执行命令,或者从数据源中 返回值。1) Commandtext 属性Command对象中最重要的属
7、性是Commandtext,它可以输入SQL语句进行查询和修改。请看下面的例子:加入一个OLEDBCommand控件。属性:Conniction:Existion - OLEDBConnection 1这就建立了 OLEDBCommandl 与 OLEDBConnection 1 的连接。 Commandtext:输入SQL语句(可以利用向导)。2) DalaReader 对象在创建一个Comman对象的实例以后,就可以使用DalaReader对象获取数剧源的数据了。DataReader对象与后面要讨论的Dataset不同,首先,这是一个只读的、前向的数据流,在 内存中每次只能有一行缓冲行,这
8、无疑减少了系统的开销。但是,网络上的开销将增大。知道这点很重要,这说明DataReader主要用于一次性的读取一些不变的数据,特别是字段 名,属性,或者其它的一些需要一次性读取的数据。卜面说明一下DataReader使用方法:加入一个 listBoxl 和一个 checkedListBoxl加入一个button 1,在click事件程序中写上:*. DataReade - Microsoft Visual C# .hT 设计-Forml.cs文件更)编辑视图9 项目9 生成调试S 数据工具9 窗口量)帮助QD 司包X 电吆 S-,1-,Dtbuc州 typ_ino而叫叨,.- 玄骷白:1同,,
9、指针DataSetOleDbConnection OleDbCommandSqlConnecbon SqtCommdnd DataViewWindows 窗体剪贴极循环常规至服务器资二 大工具箱Connection 1建.龄滓:提提供程序|连接|高级|所有|选择您希望连接的数据OLE DB提供程序(Microsoft Jet 4 0 OLE DB Provil derMicrosoft OLEDBProvidr forDTS PackagesMicrosoft OLEDBProvider forIndexing ServiceMicrosoft OLEDBProvider forInterne
10、t PublishingMicrosoft OLEDBProvi dtr forMicrosoft SttrchMicrosoft OLEDBProvider forODBC DriversMicrosoft OLEDBProvider forOLAP ServicesMicrosoft OLEDBProvider for01ap Services 8.0Microsoft OLEDBProvider forOracleMicrosoft OLEDBProvider forSQL SrvrMicrosoft OLEDBSimple Provi derMicrosoft Jtt 3. 51 OL
11、E DB ProviderMSD&taSh&peOLE DB Provider for Microsoft Dirtctory ServiceSQL Server Replication OLE DB Provider for DTSVSEE Vtrsioning EnlistmentProxy Data Source“nfo.esSystem.d |0出 |下一步国)确定 | 取消 | 帮助_ 中/。,西简 0壮行到亡匕*031rd索引结果(搜索项g块)-找到1个主题I断点就绪II次开始 J 6 3 一数蹙库|sDataReade- -W 固数据库-Microsoft Word |卜学痂fS
12、 15:50*. DataReade - Microsoft Visual C# JT 设计-Forml.cs Sit*文件更)编辑B)视图W)项目9 生成调试S 数据工具9 窗口 d)帮助理) 承 OSqiSI 电包 C 八 口 Dtbuc州 type.xnfoift | g 3之I而叫sSi后小包囱|晔注舞忠I*支:骷献|回图工具箱指针DataSetOleDbConnectionOleDbCommandSqlConnecbon SqtCommdnd DataView起始页 Formlxs iSi+F I冉 oieDbComectionl 寺 oleDbCommand 1解决方案资凝管理第
13、Da4 X| 国13引野隔 ,强决方案。taReddeC!项目 B 副 DataReade+ 3引用 啕 App.ico 1 Assembly Inf o.cs g| Forml.cs.1.7解J马类.I融资.图案Windows 窗体典贴极循环常规值服务器资 火工具箱属性q ZloleDbCommand 1System.Dat(Nam( Corner现有loleDbConnection新建(none)CornerComrr |Connectionnnectionl 中/。,画简国外 工j仕处.刃亡亡j/索引结果(搜索项try块)找到1个主题断点Modrfiers PrivateParamete
14、rs (集合)UpdatedRowSc Both次开始 J 6 3 一数蹙库|sDataReade- -Vis固数据库-Microsoft Word | 4卜学15:51xi、 DataReade - Microsoft Visual C# .NET 设计 Forml.cs $it文件9 编辑口视图项目9 生成调试)数据Q)工具任)窗口但)帮助国)info工具箱数据DataSetOleDbCommandDataView期件Windows 窗体驰服务输出厂重新生成该命令的参数集合.(2团任务列表 臼输出|考索引结果(搜索项3块)找到1个主题I有1断点器-. X |百I史 ,啾 aReade” (
15、 1 项 I类I号资素ndlSystem.。圄oleDbComm30Fyp. Text确定 | 取消 | I oleDbConnecI.% Private J* I Parameters (集合,一 1 indaSHRnuJ)nth .I 3II-II,开始| J给阜 3 曰二基础 |sDataReade- 固数据库-ME.宜|二C5基础忑4_3国16:06private void buttonl_Click(object sender, System. EventArgs e) (string SB;int Ns;System. Data. OleDb. OleDbDataReader ob
16、jdr;listBoxl. Items. Clear ();checkedListBox1. Items. Clear();打开01 eDbCommandl. Connection,准备建立DataReader对象oleDbCommandl. Connection. Open();利用01 eDbCommandl. Execut eReader 来创建 DataReader 对象注意这个枚举类型的选项,关闭Connect ion的连接。objdr = oleDbCommandl. ExecuteReader();/CommandBehaviorCommand行为,这就建立了一个DataRead
17、er*象。读取字段总数 Ns =objdr. FieldCount;把字段名填充进CheckedListBoxlfor (int i=0;iNs;i+)(CheckedListBoxl. Items. Add(objdr. GetName(i); )Read方法用于检索查询结果的每一行,每读出一行指针下移一行DataReader对象.Read. getValue(i)while (objdr. ReadO) SB =for( int i = 1;i Dtbuc因 type.xnfo口 邑A士孽 II 起始页| Forml.cs设i ljDataReade.Formlfor (“Ri/D.j w
18、hil)forml王秀琴 2000-1-200:00 004456 达标奖Z朱莉文 2000-1-200:00 00777达标奖 一严皖英 2000-1-200:00:004487 达标奖朱莉文2000-1-210:00:00666工会年终奖1k;一壬耋琴 2000-1-210:00:00100考火费朱莉文 2000-1-210:00:00100旁火费Fgg 2000-1-210:00 00200旁火霞王秀尊2000-1-210:00:00110安全俣证金利定朱莉文2000-1-210:00:00110安全保证金利及严皖英2000-1-210:00:00110安全像证金利片王秀琴 2000-1
19、-250:00:00400安全奖朱莉文 2000-1-250:00:00400安全奖产皖英 2000-1-250:00:00400安全奖王秀乘2000-2-1 0 00:00 200总厂年终奖 朱莉文2000-2-1 0:00:00 200总厂年终奖 产皖英2000-2-1 0:00:00 200总厂年终奖王秀琴2000-2-17 0:00:00 183 1月奖金 含科3 . 朱莉文 2000-2-17 0:00:00 146 9 1 月奖金二J解决方案资源省理器-MaReade 9 X |包甦荡春菽e获T顷目) 白扉DataReade+森引用. App.ico2 Assemblylnfo.e
20、s3 Forml.csSB = SB + * * + objdr GctValut (i). ToStrine0; listBoxl. Items. AddC5B);I1自动同口9 X调用堆枝Q X类熨 JSystem.D I名称名称值objdrnull.日自动窗口 | GJ局部变量 面监视1 |圆调用堆栈|匈断点|b命令窗口 I臼输出I生成成功行167 列1ChiINSi,开始| J 给 6 M LI二基础 | SDataReade-| 囿数据库-ME. | 二C5基础-忑 &_3Hll 16:08值得注意是,DataReader对象的方法中,get类型的有多个,请仔细测试,搞清它们的特点,
21、 特别是,如果已经知道了字段的类型,就没有必要使用.GetValue,而可以直接使用GetString、 GetDouble. GetDateTime等,这样就可以大大减少每一次读取使句时的类型转换,提高检索效 率。也可以把数据下载到当地的一张表里。这时候可以用DataTable,在加入行的时候,可以使用DataRow,下面的例子,说明了相应 的语法。DataTable DT =new DataTableO ;private void buttonl_Click(object sender, System. EventArgs e) int Ns;SqlDataReader objdr;Dat
22、aRow MR;sqlCommandl. Connection. Open();objdr=sq1Command1. ExecuteReader ();Ns=objdr. FieldCount;给DataTable加入栏目名称for (int i=0;iNs-l;i+)DT. Columns. Add (objdr. GetName(i);while (objdr. ReadO)(MR二DT. NewRow ();for (int i=0;i|Cnet说.期一致据“. |311aL310 10:48定义,个DataRead对象 SqlDataReader DR;定义一个表DataTable D
23、T=new DataTable();private void button I_C1ick(object sender, System. EventArgs e) 连接sqlCommandl. CommandText=textBoxl. Text;sqlCommandl. Connection. Open();DR=sqlCommand 1. ExecuteReaderO ;清空表DT. Co 1 umns. Cl ear ();DT. Clear ();构造表的结构int Ns =DR. FieldCount;for (int i=0;iNs;i+)DT. Columns. Add (DR.
24、 GetName(i);下载数据while (DR. ReadO) (DataRow Drow;Drow=DT. NewRow ();for(int j=0;jNs;j+)(Drowj=DR. GetValue(j);)DT. Rows. Add(Drow);/断开sqlCommandl. Connection. Close();关联dataGridl. DataSource=DT;三、DataAdapter对象(数据适配器)在.NET中提供了一个非常方便的对象-DataAdapter对象(也就是早期资料中的 ADODataSetCommand)。在DataAdapler对象中自动连接Conn
25、iction,并且内置了 Command,这就使DataAdapter对 象的功能异常强大,在DataAdapter对象中使用DataReader对象,更重要的,它建立了和DataSet 对象的连接,所以,在.NET数据库应用中,应该尽可能的使用DataAdapler对象。卜面我们看一下DalaAdapter对象的连接:建立一个新的Windows工程。加入一个DataAd叩ter对象对象,系统会自动给出一个连接向导,根据向导建立连接。连接完毕以后,查一下OleDataAdapter的SelectCommand属性下的CommandtText下的SQL 命令,必须确保正确。也可以双击它重新建立S
26、QL语言。完成以后,我们可以看到,系统自动加入了一个OleDbConnectionl。 也可以市新配置。下面我们试验一下利用DataAdapter对象使用DataReadero同样的,加入一个 ListBoxl 和一个 CheckedListBoxL 再加入一个Button 1,在click事件程序中写上:private void buttonl_Click(object sender, System. EventArgs e) string SB;int Ns;System. Data. OleDb. 01eDbDataReader objdr;1 istBoxl. I terns. Cle
27、ar ();checkedListBoxl. Items. Clear();打开 oleDbDataAdapterl. Select Command. Connection,准备建立 DataReader 对象o 1 eDbDataAdapter 1. SelectCommand. Connection. OpenO ;/利用 01 eDbCommand 1. Execut eReader 来仓 U 建 DataReader 对象 注意这个枚举类型的选项,关闭Connect ion的连接。objdr =oleDbDataAdapterl. SelectCommand. ExecuteReade
28、r 0;/CommandBehav iorCommand行为,这就建立 了一个DataReader对象。读取字段总数Ns =objdr. FieldCount;/把字段名填充进CheckedLi stBox 1for (int i=0;iNs;i+)(checkedListBoxl. Items. Add(objdr. GetName(i); Read方法用于检索查询结果的每一行,每读出一行指针卜移一行/DalaReader对象.Read. getValue(i)while (objdr. ReadO)(SB =for( int i = 1;i D.but老 tyP-no- 7 ?.口屯邑M母
29、近二用 II a ,三.二一=十大进制 ,.程序匚?解决方案资源管理器 MMdapter + x|_J 3 | | ,3 I 决方案DataAdapUrF 1 项目)自 0 DataAdapter+森引用. App.ico3 Assemblylnfo.es工Forml.cs称名 号名期额奖注 编姓日金发备 7解决方案资源管理器|五运行文档可以看出来效果是完全一样的,只不过用oleDbDataAdapter 1 .SelectCommand代替了原来 的 oleDbCommandl。除此以外 DataAdapter 的 InsertCommand 和 DeleteCommand 属性也是 Com
30、mand 对象。关于DataAdapter与DataSet组件的绑定,在介绍了 DataSet组件以后就会讨论。这里要注意一个问题,如果你的数据要进行Update更改,在用DataAdapter连接数据源的 时候,选择完SQL语句以后,耍点一下高级选项,勾上:生成Insert、Update, Delete语 句”,然后确定,它会自动的在 DataAdapter 的 UpdateCommand、InsertCommand、DeleteCommand 等属性中建立相应的查询语句。否则,在使用Update语句时将会出现错误。实际上这带来了 一些麻烦,也使系统不太灵活,我们后面会讨论解决这个问题的办法
31、。四、DataSet组件在ADO.NET中,DataSet组件主要支持断开的、分布式数据的情况,所谓断开意味着一旦 检索到所需的数据,就会撤销对数据源的连接,转而在本机处理数据,这样它就释放了宝贵的 数据库资源,生成高度伸缩性的应用程序。ADO.NET正是利用DataSet组件来处理断开数据的。DataSet组件是ADO.NET断开体系结构的核心组件,类似于ADO中的Recordset对象。 DataSet组件是专门为任何数据访问的独立性而设计的,所以它可以用于多个不同的数据源、 XML数据等。DataSet组件含有一个集合,该集合中有一个或多个由行和列组成的DataTable对象,利用 这个
32、对象,我们可以访问这个对象中的任何数据,这很象是ADO中Recordset的移动指针,但本质不同,在这里更加像使用数组。基本的实验DataTable DT=new DataTable();DataTable DTl=new DataTableO ;DataSet DS=new DataSet();查询一private void buttonl_Click(object sender, System. EventArgs e) DT. Co 1 umns. Cl ear ();DT. Clear ();sq1DataAdapter1. SelectCommand. CommandText=tex
33、tBox1. Text;sqlDataAdapterl. Fill(DT);dataGridl. DataSource=DT;提交private void button2 Click(object sender, System. EventArgs e) sqlDataAdapterl. Update(DT);)删除private void button5_Click(object sender, System. EventArgs e) int i=dataGridl. CurrentRowIndex;DT. Rowsi. DeleteO ;查询二private void button3_C
34、lick(object sender, System. EventArgs e) DTI. Columns. Clear ();DTI. Clear 0;sqlDataAdapterl. SelectCommand. CommandText=textBoxl. Text;sqlDataAdapterl. Fill(DTI);dataGridl. DataSource=DTl;)/加入 DataSetprivate void button4_Click(object sender, System. EventArgs e) DT. TableName=奖金;DTI. TableName=基本表;
35、DS. Tables. Add(DT);DS. Tables. Add (DTI);dataGridl. DataSource=DS;1)创建DataSet对象创建DataSet对像可以编程创建,不过编程的方法相当麻烦,.NET给出了自动创建Dataset 对象的方法。第一种方法:工程加入-加入类(Add Class)选Dataset,在Name中输入XML文件的名字.xsd,也可以用默认值(比如Datasetl.xsd), open。可以看到一个Dataset.xsd被加入了。把一个Dataset控件拖进来,这就出现一个对话框,说明这个Dataset的数据来自于什么地 方,OKo这就把一个D
36、ataset控件给加入进来了。第二种方法:菜单Data - Generate Dataset (产生 DataSet)这也出现一个对话框,说明这个Dataset的数据来自于什么地方,OK。 这也就把一个Dataset控件给加入进来了。两者效果是一样的。这时,在解决方案中会增加两个文件,Datasetl.xsd Datasetl.xsx,其中Datasetl.xsd是一 个文本类型的XML文件,目的是建立表的结构,例如在我们的例子中是如下内容:xs:choice maxOccurs=unbounded”xs:element name=奖金”xs:element name=“备注type=*xs:
37、string* min0ccurs=你当然可以手工改变,不过在.NET中,手工改变意义不大。2)利用Dataset的Rows对象查询数据Dataset的Rows对象可以映射数据的每一行,和ADO移动指针不同,这里更像使用数组。 请看下面的例子,需要完成一个程序,完成像ADO移动指针相同的动作。注意:由于需要数据更新,下面的例子DataAdapter连接数据源的时候,选择完SQL语句以后, 要点一下“高级选项”,勾上:“生成Insert、Update, Delete语句:首先进行变量定义:int Nd, Ns;string FN=new string5;FN数组用于记录字段名称string Sr, SB;int i;下面要建立五个Textbox和五个Label,我们可以用引用赋值的方法实现控件数组,先增加 两个变量定义:textBox Mytext=new textBox5; label Mylabel=new Label5;在Form的Load事件中加上:private void Forml_Load(object sender, System. EventArgs e) (Mytext0 = textBoxl;Mytext1= textBox2;My