C和ADONET数据库应用程序开发实用实用教案

上传人:莉**** 文档编号:78735766 上传时间:2022-04-22 格式:PPT 页数:111 大小:1.62MB
返回 下载 相关 举报
C和ADONET数据库应用程序开发实用实用教案_第1页
第1页 / 共111页
C和ADONET数据库应用程序开发实用实用教案_第2页
第2页 / 共111页
C和ADONET数据库应用程序开发实用实用教案_第3页
第3页 / 共111页
点击查看更多>>
资源描述
10.1 数据库的连接数据库的连接(linji)图10-1 访问SQL Server 7.0或更高版本的不同技术(jsh)之间的区别第1页/共110页第一页,共111页。10.1.1 SqlConnection的使用的使用(shyng)ConnectionString类似于OLE DB连接字符串,但并不相同。可以使用ConnectionString属性(shxng)连接到数据库。下面是一个典型的连接字符串:Persist Security Info=False;Integrated Security=SSPI;database=northwind;server=mySQLServer第2页/共110页第二页,共111页。连接字符串的基本格式包括一系列由分号分隔的关键字/值对。使用等号(=)连接各个关键字及其值。 下面列出了ConnectionString中的关键字值的有效名称及其含义(hny)。(1) Application Name:应用程序的名称,如果不提供应用程序名称,默认是:“.NET SqlClient Data Provider”。(2) Database:指定数据库的名称。 第3页/共110页第三页,共111页。(3) Connect Timeout或Connection Timeout:在终止尝试连接并产生错误之前,等待与服务器建立连接的时间(shjin)长度(以s为单位)。(4) Data Source/Server/Address/Addr/Network Address:要连接的SQL Server实例的名称或网络地址。第4页/共110页第四页,共111页。(5) Encrypt:默认值为false,当该值为true时,如果服务器端安装了证书,则SQL Server将对所有在客户端和服务器之间传送的数据使用SSL加密。可识别的值为true、false、yes和no。 (6) Initial Catalog:数据库的名称。(7) Integrated Security或Trusted_Connection:默认值为false,当为false时,将在连接中指定用户(yngh)ID和密码。当为true时,将使用当前的Windows账户凭据进行身份验证。第5页/共110页第五页,共111页。 可识别的值为true、false、yes、no及与true等效(dn xio)的SSPI(强烈推荐)。(8) Network Library或Net:默认值为dbmssocn,用于建立与SQL Server实例连接的网络库。支持的值包括dbnmpntw(命名管道)、dbmsrpcn(多协议)、dbmsadsn(Apple Talk)、dbmsgnet(VIA)、dbmslpcn(共享内存)及dbmsspxn (IPX/SPX)和dbmssocn(TCP/IP)。 第6页/共110页第六页,共111页。(9) Packet Size:默认值是8 192,用来与 SQL Server 的实例进行通信的网络(wnglu)数据包的大小,以字节为单位。(10) Password或Pwd:SQL Server账户登录的密码(建议不要使用,为了维护最高级别的安全性,强烈建议改用 Integrated Security或Trusted_Connection 关键字)。 第7页/共110页第七页,共111页。(11) Persist Security Info:默认值为false,当该值设置为false或no(强烈推荐)时,如果连接是打开的或者一直处于打开状态,那么安全(nqun)敏感信息(如密码)将不会作为连接的一部分返回。重置连接字符串将重置包括密码在内的所有连接字符串值。可识别的值为true、false、yes和no。(12) User ID:SQL Server 登录账户(建议不要使用。为了维护最高级别的安全(nqun)性,强烈建议改用Integrated Security或Trusted_Connection关键字)。 第8页/共110页第八页,共111页。(13) Workstation ID:本地计算机名称连接到SQL Server的工作站的名称。下面的代码是创建一个(y )SqlConnection并设置它的一些属性:第9页/共110页第九页,共111页。10.1.2 OleDbConnection的使用的使用(shyng)一个 OleDbConnection 对象表示到数据源的一个唯一的连接,在客户端/服务器数据库系统架构下,它等效于到服务器的一个网络连接。OleDbConnection 对象的某些方法或属性可能(knng)不可用,这取决于本机 OLE DB 提供程序所支持的功能。下面的例子是创建一个OleDbCommand和一个OleDbConnection。将OleDbConnection打开并设置为OleDbCommand的Connection,然后调用ExecuteNonQuery并关闭该连接。 第10页/共110页第十页,共111页。public void InsertRow(string myConnectionString)/ If the connection string is null,usea default.if(myConnectionString = = )myConnectionString =Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=Northwind;+Integrated Security=SSPI;OleDbConnection myConnection =new OleDbConnection(myConnectionString);string myInsertQuery = INSERT INTO Customers (CustomerID,CompanyName)Values(NWIND,Northwind Traders);第11页/共110页第十一页,共111页。10.1.3 OdbcConnection的使用的使用(shyng)OdbcConnection对象表示到数据源的唯一连接,该数据源是通过使用连接字符串或ODBC数据源名称(Data Sourse Name, DSN)创建的。在客户端/服务器数据库系统架构下,它等效于到服务器的一个网络连接。OdbcConnection对象的某些方法或属性可能不能使用,具体情况视本机ODBC驱动程序支持(zhch)的功能而定。 第12页/共110页第十二页,共111页。下面的例子是创建一个OdbcCommand和一个OdbcConnection。将OdbcConnection打开并设置为OdbcCommand.Connection属性(shxng),然后调用ExecuteNonQuery并关闭该连接。 第13页/共110页第十三页,共111页。public void InsertRow(string myConnection)/ If the connection string is null, use a defaultif(myConnection = ) myConnection=DRIVER=SQL Server;Server=MyServer;Trusted_connection=yes; DATABASE=northwind;OdbcConnection myConn = new OdbcConnection(myConnection);第14页/共110页第十四页,共111页。string myInsertQuery = INSERT INTO Customers (CustomerID, CompanyName) VALUES(NWIND, Northwind Traders);OdbcCommand myOdbcCommand = new OdbcCommand(myInsertQuery);myOdbcCommand.Connection = myConn;myConn.Open( );myOdbcCommand.ExecuteNonQuery( );myOdbcCommand.Connection.Close( );第15页/共110页第十五页,共111页。OleDbCommand myCommand = new OleDbCommand(myInsertQuery);myCommand.Connection = myConnection;myConnection.Open( );myCommand.ExecuteNonQuery( );myCommand.Connection.Close( );第16页/共110页第十六页,共111页。public void CreateSqlConnection( ) SqlConnection myConnection = new SqlConnection( );myConnection.ConnectionString=Persist Security Info=False;Integrated Security=SSPI;database=northwind;server=mySQLServer;Connect Timeout=30;myConnection.Open( );第17页/共110页第十七页,共111页。10.1.4 OracleConnection的使用的使用(shyng)Microsoft .NET Framework Data Provider for Oracle(以下简称为.NET for Oracle)是一个.NET Framework的组件。这个组件为用户使用.NET访问Oracle数据库提供(tgng)了极大的方便。 1系统需求和安装在安装.NET for Oracle之前,必须首先安装.NET Framework version 1.0。同时,还要确定安装了数据访问组件(MDAC 2.6及其以上版本,推荐版本是2.7)。 第18页/共110页第十八页,共111页。是要访问Oracle数据库的数据,那么还需要安装(nzhung)Oracle 8i Release 3(8.1.7)Client及其以上版本。 组件的安装(nzhung)非常方便,直接运行oracle_net.msi。在安装(nzhung)过程中无需任何设置,连续单击NEXT按钮即可完成安装(nzhung)。默认安装(nzhung)将在C:Program Files Microsoft.NET目录下建立一个名为OracleClient. Net的文件夹。 第19页/共110页第十九页,共111页。对于开发人员,其中至关重要的是System.Data.OracleClient.dll文件,这是.NET for Oracle组件的核心文件。开发人员可以通过安装oracle_net.msi来使用.NET for Oracle组件,这时系统会将此组件作为一个系统默认的组件来使用,就好像是人们(rn men)所熟悉的System.Data.SqlClient和System.Data.OleDb组件一样。 第20页/共110页第二十页,共111页。2操作实例.NET for Oracle组件中用于组织(zzh)类和其他类型的命名空间是System.Data.OracleClient。在此命名 空 间 中 , 主 要 包 含 4 个 核 心 类 , 它 们 分 别 是 : O r a c l e C o n n e c t i o n 、 O r a c l e C o m m a n d 、O r a c l e D a t a R e a d e r 、 O r a c l e D a t a A d a p t e r 。 这 些 内 容 非 常 简 单 , 其 具 体 使 用 方 法 几 乎 和SqlConnection、SqlCommand、SqlDataReader SqlDataAdapter是完全相同的 。第21页/共110页第二十一页,共111页。下面是一个使用.NET for Oracle组件(z jin)操纵Oracle数据库的例子。 建立一个名为OracleTypesTable的表: CREATE TABLE OracleTypesTable (MyVarchar2 VARCHAR(3000), MyNumber NUMBER(28,4),PRIMARY KEY ,MyDate DATE,MyRaw RAW(255);插入一行数据: INSERT INTO OracleTypesTable VALUES(test,4,to_date(2000-01-11 12:54:01,yyyy-mm-dd hh24:mi:ss),0001020304);第22页/共110页第二十二页,共111页。下面的程序(chngx)是要通过.NET for Oracle组件来访问Oracle数据库,并显示出这行数据。 using System;using System.Web;using System.Web.UI;using System.Web.UI.HtmlControls;using System.Web.UI.WebControls;using System.Data;using System.Data.OracleClient;第23页/共110页第二十三页,共111页。public class pic2:Page public Label message;public void Page_Load(Object sender,EventArgs e)/设置(shzh)连接字符串string connstring=Data Source=eims;user=zbmis;password=zbmis;/实例化OracleConnection对象第24页/共110页第二十四页,共111页。OracleConnection conn=new OracleConnection(connstring);tryconn.Open( );/实例(shl)化OracleCommand对象OracleCommand cmd=conn.CreateCommand( );cmd.CommandText=SELECT * FROM zbmis.OracleTypesTable;第25页/共110页第二十五页,共111页。OracleDataReader oracledatareader1=cmd.ExecuteReader( );/读取数据while (oracledatareader1.Read( ) /读取并显示(xinsh)第一行第一列的数据OracleString oraclestring1=oracledatareader1.GetOracleString(0);Response.Write(OracleString +oraclestring1.ToString( );/读取并显示(xinsh)第一行第二列的数据OracleNumber oraclenumber1 =oracledatareader1.GetOracleNumber(1);第26页/共110页第二十六页,共111页。Response.Write(OracleNumber +oraclenumber1.ToString( );/读取并显示(xinsh)第一行第三列的数据OracleDateTime oracledatetime1=oracledatareader1.GetOracleDateTime(2);Response.Write(OracleDateTime +oracledatetime1.ToString( );/读取并显示(xinsh)第一行第四列的数据OracleBinary oraclebinary1=oracledatareader1.GetOracleBinary(3);第27页/共110页第二十七页,共111页。if(oraclebinary1.IsNull=false)foreach(byte b in oraclebinary1.Value)Response.Write(byte +b.ToString( );/释放(shfng)资源第28页/共110页第二十八页,共111页。oracledatareader1.Close( );catch(Exception ee)/异常处理message.Text=ee.Message;finally/关闭(gunb)连接conn.Close( );第29页/共110页第二十九页,共111页。10.2 数据数据(shj)的获取的获取第30页/共110页第三十页,共111页。10.2.1 创建创建(chungjin)Command对象对象Command对象是对数据存储执行命令的对象。虽然Connection对象也有这个(zh ge)功能,但是Connection对象在处理命令的功能上受到一定的限制,而Command对象是特别为处理命令的各方面问题而创建的。实际上,当从Connection对象中运行一条命令时,已经隐含地创建一个Command对象。 第31页/共110页第三十一页,共111页。10.2.2 执行命令执行命令建立了数据源的连接和设置了命令(mng lng)之后,Command对象可采用以下3种方法执行SQL命令(mng lng):ExecuteNonQuery、ExecuteReader和ExecuteScalar。(1) ExecuteNonQuery 执行命令(mng lng),但不返回任何结果。(2) ExecuteReader执行命令(mng lng),返回一个类型化dataReader。(3) ExecuteScalar执行命令(mng lng),返回一个值。第32页/共110页第三十二页,共111页。SqlCommand 类也提供了下面两个(lin )方法。(1) ExecuteResultset为将来使用而保留。(2) ExecuteXmlReader执行命令,返回一个 XmlReader。 第33页/共110页第三十三页,共111页。具体说明如下。(1) 用ExecuteNonQuery方法执行命令不会返回结果集,只会返回语句影响的记录行数,它适合执行插入、更新、删除之类不返回结果集的命令。如果是SELECT语句,那么(n me)返回的结果是-1,如果发生回滚,这个结果也是-1。例如:第34页/共110页第三十四页,共111页。using System;using System.Data;using System.Data.SqlClient;public class myDataAccesspublic static void Main( )SqlConnection conn = new SqlConnection(Server=localhost;Database=Northwind;User ID=sa;PWD=sa);SqlCommand cmd = new SqlCommand(UPDATE Orders SET第35页/共110页第三十五页,共111页。OrderDate=2004-9-1 WHERE OrderID=10248,conn);tryconn.Open( );int I = cmd.ExecuteNonQuery( );Console.WriteLine(i.ToString( ) + rows affected by UPDATE);cmd.CommandText = SELECT * FROM Orders;i = cmd.ExecuteNonQuery( );Console.WriteLine(i.ToString( ) + rows affected by SELECT);catch(Exception ex)Console.WriteLine(ex.Message);finallyconn.Close( );第36页/共110页第三十六页,共111页。(2) 使用(shyng)ExecuteReader方法执行命令可以返回一个类型化的DataReader实例或者IDataReader接口的结果集。 例如:using System;using System.Data;using System.Data.SqlClient;第37页/共110页第三十七页,共111页。public class myDataAccesspublic static void Main( )SqlConnection conn = new SqlConnection(Server=localhost;Database=Northwind;Uer ID=sa;PWD=sa);SqlCommand cmd = new SqlCommand(SELECT TOP 20 * FROM Orders,conn);SqlDataReader reader; /或者(huzh)IDataReader reader;第38页/共110页第三十八页,共111页。tryconn.Open( );reader = cmd.ExecuteReader( );while(reader.Read( )Console.WriteLine(reader0.ToString( );reader.Close( );catch(Exception ex)Console.WriteLine(ex.Message);finallyconn.Close( );第39页/共110页第三十九页,共111页。(3) 使用ExecuteScalar方法时,如果(rgu)想获得数据的记录行数,可以通过SELECT COUNT(*)这样的语句取得一个聚合的行集合。 例如:using System;using System.Data;using System.Data.SqlClient;第40页/共110页第四十页,共111页。public class myDataAccesspublic static void Main( )SqlConnection conn = new SqlConnection(Server=localhost;Database=Northwind;Uer ID=sa;PWD=sa);SqlCommand cmd = new SqlCommand(SELECT COUNT(*) FROM Orders,conn);第41页/共110页第四十一页,共111页。tryconn.Open( );int i = (int)cmd.ExecuteScalar( );Console.WriteLine(record num : + i.ToString( );cmd.CommandText = SELECT CAST(avg(Freight) AS int) FROM Orders;int avg = (int)cmd.ExecuteScalar( );Console.WriteLine(avg : + avg.ToString( );第42页/共110页第四十二页,共111页。cmd.CommandText = SELECT AVG(Freight) FROM Orders;avg = (int)cmd.ExecuteScalar( ); /引发(yn f)异常Console.WriteLine(avg : + avg.ToString( );catch(Exception ex)Console.WriteLine(ex.Message);finallyconn.Close( ); 第43页/共110页第四十三页,共111页。(4) ExecuteResultSet(只用于SQL提供者)方法标记为“为将来使用而保留”,如果不小心调用了它,就会抛出一个异常:System.NotSupportedException(5) ExecuteXmlReader(只用于SQL提供者)方法执行命令将给调用者返回一个XmlReader对象。 SQL Server允许使用FOR XML子句来扩展(kuzhn)SQL子句,这个子句可以带有下述3个选项中的一个:第44页/共110页第四十四页,共111页。 FOR XML AUTO FOR XML RAW FOR XML EXPLICIT例如(lr):using System;using System.Data.SqlClient;using System.Data;using System.Xml;第45页/共110页第四十五页,共111页。/ / Class1 的摘要说明(shumng)/ class Class1/ / 应用程序的主入口点/ STAThread第46页/共110页第四十六页,共111页。static void Main(string args)/ TODO: 在此处添加(tin ji)代码以启动应用程序/string source = workstation id=localhost;Integrated Security=SSPI;database=NorthWind;string select = SELECT ContactName,CompanyName +FROM Customers FOR XML AUTO;第47页/共110页第四十七页,共111页。SqlConnection conn = new SqlConnection(source);conn.Open( );SqlCommand cmd = new SqlCommand(select, conn);XmlReader xr = cmd.ExecuteXmlReader( );while(xr.Read( )Console.WriteLine(xr.ReadOuterXml( );conn.Close( );第48页/共110页第四十八页,共111页。10.2.3 参数参数(cnsh)化查询化查询参数化查询能够使性能得到一定的优化,因为带参数的SQL语句只需要被SQL执行引擎分析过一次。Command的Parameters能够为参数化查询设置参数值。Parameters是一个(y )实现IdataParamter Collection接口的参数集合。不同的数据提供程序的Command对参数传递的第49页/共110页第四十九页,共111页。使用不太一样,其中SqlClient和OracleClient只支持SQL语句中的命名参数而不支持问号占位符,必须使用命名参数,而OleDb和Odbc数据提供(tgng)程序只支持问号占位符,不支持命名参数。 对于查询语句SqlClient必须使用命名参数,形式类似于下面的语句: SELECT * FROM Customers WHERE CustomerID = CustomerID 第50页/共110页第五十页,共111页。Oracle的命名参数前面不用,使用(:),写为(:CustomerID)。而对于OleDb或者Odbc则必须使用?占位符,形式类似于下面的语句: SELECT * FROM Customers WHERE CustomerID = ?下面以SQL Server为例,说明(shumng)其使用方法:using System;using System.Data;using System.Data.SqlClient;第51页/共110页第五十一页,共111页。public class myDataAccesspublic static void Main(String args)SqlConnection conn =new SqlConnection(Server=localhost;Database=Northwind;UID=sa;PWD=sa);SqlCommand cmd = new SqlCommand(SELECT * FROM Orders WHERE OrderID=oid,conn);SqlDataReader reader;第52页/共110页第五十二页,共111页。tryint param = Convert.ToInt32(args0);cmd.Parameters.Add(oid,param); /使用(shyng)命名参数cmd.Parameters0.Direction = ParameterDirection.Input;conn.Open( );reader = cmd.ExecuteReader( );while(reader.Read( )Console.WriteLine(reader0.ToString( );第53页/共110页第五十三页,共111页。reader.Close( );catch(Exception ex)Console.WriteLine(ex.Message);finallyconn.Close( );第54页/共110页第五十四页,共111页。对于OleDb或者Odbc数据提供程序的命令参数,只需要按照占位符从左到右的顺序(shnx)将参数与Parameters集合进行匹配就行了。 例如:using System; using System.Data;using System.Data.OleDb;第55页/共110页第五十五页,共111页。public static void Main(String args)OleDbConnection conn = new OleDbConnection(Provider=SQLOLEDB;Server=localhest;Database=Northwind;User ID=sa;PWD=sa);OleDbCommand cmd = new OleDbCommand(SELECT * FROM Orders WHERE OrderID=? or EmployeeID=?,conn);OleDbDataReader reader;第56页/共110页第五十六页,共111页。tryint param1 = Convert.ToInt32(args0);int param2 = Convert.ToInt32(args1);cmd.Parameters.Add(aaa,param1);cmd.Parameters.Add(bbb,param2);/参数对象还需要名字(mng zi),但是和查询语句中的参数无关cmd.Parameters0.Direction = ParameterDirection.Input;第57页/共110页第五十七页,共111页。cmd.Parameters1.Direction = ParameterDirection.Input;conn.Open( );reader = cmd.ExecuteReader( );while(reader.Read( )Console.WriteLine(reader0.ToString( );reader.Close( );第58页/共110页第五十八页,共111页。catch(Exception ex)Console.WriteLine(ex.Message);finallyconn.Close( );第59页/共110页第五十九页,共111页。10.2.4 执行存储执行存储(cn ch)过程过程使用Command对象访问数据库的存储过程(guchng),需要指定CommandType属性,这是一个CommandType枚举类型,在默认情况下CommandType表示CommandText命令为SQL批处理,CommandType.StoredProcedure值指定执行的命令是存储过程(guchng)。 类似于参数化查询,存储过程(guchng)的参数也可以使用Parameters集合来设置,其中Parameter对象的Direction属性用于指示参数是只可输入、只可输出、双向还是存储过程(guchng)返回值参数。 第60页/共110页第六十页,共111页。例如:/存储(cn ch)过程CREATE procedure myProTest (orderID AS INT, elyTitle AS VARCHAR(50) OUTPUT)AsSELECT elyTitle=ely.Title FROM Orders o JOIN Employees ely ON ely.EmployeeID=o.EmployeeID WHERE o.OrderID=orderIDSELECT * FROM Orders WHERE OrderID=orderIDreturn 1;第61页/共110页第六十一页,共111页。/程序(chngx)using System;using System.Data;using System.Data.SqlClient;public class myDataAccesspublic static void Main( )SqlConnection conn =new SqlConnection(Server=localhost;Database=Northwind;UID=sa;PWD=sa); 第62页/共110页第六十二页,共111页。SqlCommand cmd = new SqlCommand(myProTest,conn);cmd.CommandType = CommandType.StoredProcedure;cmd.Parameters.Add(orderID,10252);cmd.Parameters.Add(elyTitle,SqlDbType.VarChar,50);cmd.Parameters.Add(return,SqlDbType.Int);cmd.Parameters0.Direction = ParameterDirection.Input;第63页/共110页第六十三页,共111页。cmd.Parameters1.Direction = ParameterDirection.Output;cmd.Parameters2.Direction = ParameterDirection.ReturnValue;SqlDataReader reader;tryconn.Open( );Console.WriteLine(execute reader.);reader = cmd.ExecuteReader( );Console.WriteLine(orderID = 0,cmd.Parameters0.Value);第64页/共110页第六十四页,共111页。Console.WriteLine(elyTitle = 0,cmd.Parameters1.Value);Console.WriteLine(Return = 0,cmd.Parameters2.Value);Console.WriteLine(reader close.);reader.Close( );Console.WriteLine(orderID = 0,cmd.Parameters0.Value);Console.WriteLine(elyTitle = 0,cmd.Parameters1.Value);第65页/共110页第六十五页,共111页。Console.WriteLine(Return = 0,cmd.Parameters2.Value);Console.WriteLine(execute none query.);cmd.ExecuteNonQuery( );Console.WriteLine(orderID = 0,cmd.Parameters0.Value);Console.WriteLine(elyTitle = 0,cmd.Parameters1.Value);Console.WriteLine(Return = 0,cmd.Parameters2.Value);第66页/共110页第六十六页,共111页。catch(Exception ex)Console.WriteLine(ex.Message);finallyconn.Close( );第67页/共110页第六十七页,共111页。10.3 DataReader的使用的使用(shyng)第68页/共110页第六十八页,共111页。10.3.1 DataReader简介简介(jin ji)DataReader(数据阅读器)是从一个数据源中选择某些数据的最简单方法,但这也是功能最弱的一个方法。虽然DataReader不如DataSet强大,但是(dnsh)在很多情况下需要的是灵活地读取数据而不是在内存里面缓存大量的数据。 DataReader尤其适合读取大量的数据,因为它不在内存中缓存数据。 第69页/共110页第六十九页,共111页。DataReader对象是数据库数据的检索主要的对象之一。当使用Connection和Command对象连接到数据源,并利用(lyng)命令对其进行查询后,就需要某种方法来读取返回的结果。 DataReader对象提供实现快速访问数据库的、未缓冲的、只前向移动的只读游标,对数据源数据进行逐行访问,也就是说,它一次读入一个行,然后遍历所有的行。第70页/共110页第七十页,共111页。使用DataReader的时候,不能直接实例化DataReader类,而是通过执行Command对象的ExecuteReader方法(fngf)返回它的实例,例如: OleDbDataReader OleDbReader = OleDbComm.ExecuteReader( );使用OleDbCommand对象的ExecuteReader方法(fngf)实例化了一个DataReader。第71页/共110页第七十一页,共111页。例如(lr):using System;using System.Data.OleDb;using System.Data;namespace OlDbRead/ / Class1 的摘要说明/ 第72页/共110页第七十二页,共111页。class Class1/ / 应用程序的主入口(r ku)点/ STAThreadstatic void Main(string args)/ TODO: 在此处添加代码以启动应用程序第73页/共110页第七十三页,共111页。/string source = Provider=SQLOLEDB; +server=localhost; +uid = sa; pwd=;+database = northwind;string select = SELECT ContactName,CompanyName FROM Customers;OleDbConnection conn = new OleDbConnection(source);第74页/共110页第七十四页,共111页。conn.Open( );OleDbCommand cmd = new OleDbCommand(select,conn);OleDbDataReader aReader = cmd.ExecuteReader( );while(aReader.Read( )Console.WriteLine(0 from 1,aReader.GetString(0),aReader.GetString(1);aReader.Close( );conn.Close( );第75页/共110页第七十五页,共111页。10.3.2 使用使用(shyng)DataReader读取数读取数据据1创建DataReader对象(duxing)前面提到过没有构造函数创建DataReader对象(duxing),通常使用Command类的ExecuteRader方法来创建DataReader对象(duxing):SqlCommand cmd = new SqlCommand(commandText,ConnectionObject)SqlDataReader dr = cmd.ExecuteReader( );第76页/共110页第七十六页,共111页。2使用命令行指定DataReader的特征SqlDataRader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);上面使用的是CommandBehavior.CloseConnection,作用是关 闭 D a t a R e a d e r 的 时 候 ( s h h o u ) 自 动 关 闭 对 应 的ConnectionObject,这样可以避免忘记关闭DataReader对象以后关闭Connection对象。这个参数能保证开发者记得关闭连接。另外CommandBehavior.SingleRow可以使结果集返回单行,Command Behavior.SingleResult返回结果为多个结果集的第一个结果集。 第77页/共110页第七十七页,共111页。3遍历DataReader中的记录DataReader常用的格式:While(dr.Reader( )/do something with the current record4访问字段的值DataReader提供两种方法(fngf)访问字段的值。第一种是Item属性,此属性返回字段索引或者字段名字对应的字段的值。第二种是Get方法(fngf),此方法(fngf)返回由字段索引指定的字段的值。第78页/共110页第七十八页,共111页。(1) Item属性。每个DataReader类都定义一个Item属性。假如现有一个DataReader实例dr,对应(duyng)的SQL语句是SELECT Fid,Fname FROM friend,则可以使用下面的方法取得返回的值:object ID = drFid;object Name = drFname;第79页/共110页第七十九页,共111页。或者(huzh):object ID = dr0;object Name = dr0;注意索引总是从0开始。 另外本例使用的是object来定义ID和Name,因为Item属性返回的值是object类型,但是可以进行强制类型转换。 第80页/共110页第八十页,共111页。int ID = (int)drFid;string Name = (string)drFname;记住( j zh)一定要确保类型转换的有效性,否则将出现异常。(2) Get方法。 下面的例子是使用该方式访问Fid和Fname的值:int ID = dr.GetInt32(0);string Name = dr.GetString(1);第81页/共110页第八十一页,共111页。另外Get方法(fngf)不能使用字段名来访问字段,下面的访问方法(fngf)是错误的:int ID = dr.GetInt32(Fid); /错误string Name = dr.GetString(Fname);/错误第82页/共110页第八十二页,共111页。10.3.3 在在DataReader中使用多个中使用多个(du )结结果集果集在对数据库进行操作的过程中,有时需要同时使用两个或者多个查询完成对数据库的查询。 DataReader提供了另一个遍历结果集的方法NextResult( ),其作用是把数据读取器移动到下一个结果集,这个方法可以与Read( )方法协同工作 。 Read( )方法是把游标移动到当前结果集的下一条(y tio)记录,而NextResult( )方法是把游标移到下一个结果集,然后,Read( )方法再基于那个结果集上开始工作。第83页/共110页第八十三页,共111页。例如(lr) :using System;using System.Data;using System.Data.SqlClient;namespace ConsoleApplication1class Class1第84页/共110页第八十四页,共111页。/ / 应用程序的主入口点/ STAThreadstatic void Main(string args)/ TODO: 在此处添加(tin ji)代码以启动应用程序/string connstr = server = .;Integrated Security=SSPI; database = Northwind; 第85页/共110页第八十五页,共111页。SqlConnection conn = new SqlConnection(connstr);string SQL = SELECT companyname,contactname FROM customers; SELECT firstname,lastname FROM employees; SqlCommand sqlComm = new SqlCommand(SQL,conn);第86页/共110页第八十六页,共111页。tryconn.Open( );SqlDataReader dr = sqlComm.ExecuteReader( );doConsole.WriteLine(0tt1,dr.GetName(0),dr.Get Name(1);第87页/共110页第八十七页,共111页。while(dr.Read( )Console.WriteLine(0tt1,dr.GetSqlString(0), dr.GetSqlString(1);while(dr.NextResult( );第88页/共110页第八十八页,共111页。dr.Close( );conn.Close( );catch(Exception e)Console.WriteLine(e.Message); finally conn.Close( ); Console.ReadLine( );第89页/共110页第八十九页,共111页。10.4 DataSet和和DataAdapter的使用的使用(shyng)第90页/共110页第九十页,共111页。10.4.1 DataSet简介简介(jin ji)DataSet对象与ADO Recordset对象相似,但功能更为强大,并具有另一个重要区别:DataSet始终是断开的。DataSet对象表示数据的缓存,具有类似数据库的结构,如表、列、关系和约束。但是,尽管DataSet可以像数据库那样运行,但重要的是:DataSet对象不直接与数据或其他源数据进行交互,这使得开发人员能够(nnggu)使用始终保持一致的编程模型,而不用理会源数据的驻留位置。所有来自于数据库、XML文件、代码或用户输入的数据都可添加到DataSet对象中。 第91页/共110页第九十一页,共111页。下面介绍创建一个空DataSet对象的方法,关于DataSet的使用方法将在后面(hu mian)详细介绍。DataSet ds = new DataSet( );这样创建的DataSet对象的DataSetName属性被设置为NewDataSet。该属性用于描述DataSet的内部名称,以便以后引用。此外,也可以在构造函数中指定,它以字符串的形式接受名称:DataSet ds = new DataSet(MyDataSet);或者可以这样简单地设置属性:DataSet ds = new DataSet( );ds.DataSetName = MyDataSet;第92页/共110页第九十二页,共111页。10.4.2 DataAdapter简介
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!