C#数据库编程_第1页
C#数据库编程_第2页
C#数据库编程_第3页
C#数据库编程_第4页
C#数据库编程_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、c#数据库编程 ,11.1 数据库编程基础,11.1.1 ado.net简介 11.1.2 第一个简单例子 11.1.3 访问数据库的一般步骤,11.1.1 ado.net简介,ado(active data objects)是microsoft开发的面向对象的数据访问库,ado.net是ado的后续技术,提供对sql sever等数据源的一致访问。数据使用者可以通过ado.net来连接到这些数据源(sql serveraccessole db等),并检索、操作和更新数据,ado.net dataset是ado.net结构的核心组建, dataset中包括一个或多个datatable对象的集合

2、,这些对象由数据行和数据列以及主键、外键、约束和有关datatable对象中数据的关系信息组成。 ado.net的另外一个核心元素是.net framawork数据提供程序,能够实现数据操作和对数据的快速访问。其中,connection对象提供与数据源的连接;command对象使你能够访问用于返回数据、修改数据、运行存储过程以及发送或检索参数信息的数据库命令;datareader对象从数据源中提供高性能的数据流;dataadapter对象提供连接dataset对象和数据源的桥梁,目前,.net framawork附带了两个数据提供程序:sql server 和ole db数据提供程序。 ole

3、 db数据提供程序位于system.data.oledb空间, sql server 数据提供程序位于system.data.sqlclient命名空间。以下是每个数据提供程序所包含的主要类,11.1.2 第一个简单例子,现在编写一个名为getstudent的访问sql server数据库的控制台应用程序,对学生信息表中的信息进行读取(假设学生信息表已经建立,using system; using system.collections.generic; using system.data; using system.data.sqlclient,namespace getstudent cla

4、ss program static void main( ) string connstr=“server=(local); initial catalog=students;user id=sa;password=1234”; sqlconnection conn=new sqlconnection(connstr); conn.open( ); sqlcommand cmd=conn.createcommand( ); cmd.commandtext=“select id,sname from student”; sqldatareader reader=cmd.executereader

5、(,string output; while(reader.read( ) output=string .format(“学生 0t的学号是1”,reader.getstring(1),reader.getstring(0); console.writeline(output); reader.close( ); conn.close( );,实例代码讲解,1)导入数据访问的名称空间,表示在该程序中将使用sql server 数据提供程序。 using system; using system.collections.generic; using system.data; using syst

6、em.data.sqlclient,2)在main主方法中,首先定义了一个字符串类型的connstr变量,用来存放连接sql server的数据库连接字符串。接着新建了一个sqlconnection对象,用于连接数据库。 string connstr=“server=(local); initial catalog=students;user id=sa;password=1234”; sqlconnection conn=new sqlconnection(connstr); (3)调用conn对象的open方法打开数据库连接。 conn.open(,4)新建sqlcommand对象,该对象

7、用于向数据库发出命令。通过调用数据库连接对象conn的createcommand方法来建立sqlcommand对象。 sqlcommand cmd=conn.createcommand( ); (5)有了命令对象cmd后,指定该命令对象的属性commandtext。 cmd.commandtext=“select id,sname from student”; (6)命令对象cmd设置完毕,可以向数据库发出命令,执行在commandtext中定义的操作。cmd对象的执行结果保存在sqldatareader对象reader中。 sqldatareader reader=cmd.executere

8、ader(,7)在reader中已经保存了从数据库读取的信息,现在的任务是输出它们。从数据读取器中获取数据一般用while循环,read()方法一直返回真值,直到reader的指针指向最后一条记录的后面。 while(reader.read( ) output=string .format(“学生 0t的学号是1”,reader.getstring(1),reader.getstring(0); console.writeline(output); (8) 数据读取以后,应该关闭数据读取器和数据库连接对象。 reader.close( ); conn.close(,11.1.3 访问数据库的一

9、般步骤,从前面例子的分析中,得出通过ado.net访问数据库的一般步骤如下: (1)建立数据库连接对象(connection对象); (2)打开数据库连接(connection对象的open方法); (3)建立数据库命令对象,指定命令对象所使用的连接对象(command); (4)指定命令对象的命令属性(commandtext属性); (5)执行命令(command的方法,如executereader); (6)操作返回结果(对sqlreaderdata对象进行读取); (7)关闭数据库连接,11.2.4 数据连接,在数据访问中必须建立到数据库的物理连接。每个数据提供程序都包含自己特有的con

10、nection对象。当使用ole db数据提供程序时,要使用system.data.oledb空间的oledbconnection对象, 使用sql server 数据提供程序时,要使用位于system.data.sqlclient命名空间的sqlconnection对象。 在程序开始导入名称空间system.data.sqlclient和system.data.oledb, 连接sql server数据源,1、sqlconnection类 sqlconnection类有两个构造函数,一个不带参数,一个接受连接字符串。可以使用以下两种方法进行实例化连接。 string conn

11、str=“server=(local); initial catalog=students;user id=sa;password=1234”; sqlconnection conn=new sqlconnection(connstr); conn.open( ); 或者 sqlconnection conn=new sqlconnection(“server=(local); initial catalog=students;user id=sa;password=1234”;); conn.open(,注意:只有当一个连接关闭后才能把两外一个不同的连接字符串赋值给connection对象。

12、 如果不知道该对象是打开的还是关闭的,可以检查对性的state属性,它的值可以是open,也可以是closed,2、连接字符串connectionstring 连接字符串包含由一些“属性名=值”对组成的集合,每个“属性名=值”对都由分号隔开。 string connstr=“server=(local); initial catalog=students;user id=sa;password=1234”; 其中,server为服务器地址,值local表示使用本地机器。server关键字也可以用data source来代替,即字符串可以写成 string connstr=“data sourc

13、e=(local); initial catalog=students;user id=sa;password=1234,initial catalog指明了连接使用的数据库,user id和password则分别指明了访问数据库时使用的用户名和密码。 如果在安装数据库软件时选择的身份验证方式为windows身份验证模式,则应使用如下连接字符串: string connstr=“data source=(local); initial catalog=students; integrated security=sspi”; integrated security=sspi表示连接时使用的是wi

14、ndows身份验证模式,3、sqlconnection的方法 sqlconnection由自己的方法,如前面使用过的open( )和closed( )方法。 其他方法还有: createcommand 创建并返回一个与sqlconnection关联的sqlcommand对象。 changedatabase 为打开的sqlconnection更改当前数据库。 注意:数据库连接必须小心,应该在最晚的时候建立连接,在最早的时候关闭连接,以释放占用的内存和网络带宽资源,4、连接sql server的数据访问实例 (1)启动visual studio .net,新建一个windows 应用程序。 (2)

15、从工具栏中拖动一个button控件到页面中,将id设为btnconnect,text属性为“点击连接数据库”。 (3)在form1.cs文件中添加名称空间 using system.data.sqlclient; (4)双击btnconnect控件,在click事件相关处理程序btnconnect_click中输入以下代码,try sqlconnection conn=new sqlconnection( ); conn.connectionstring=“data source=(local);user id=sa;password=1234; initial catalog=student

16、;”; conn.open( ); if(conn.state=connectionstate.open) messagebox.show(“连接已经打开”); conn.close( ); if(conn.state=connectionstate.closed) messagebox.show(“连接已经关闭”); catch(exception e) messagebox.show(“连接失败,原因可能是“+e.message);,5、按ctrl+f5运行项目,单击表单中的”点击连接数据库“按钮,如果数据库连接成功,则将依次弹出两个对话框。 6、如果连接不成功,则会得到提示错误信息的页面

17、, 连接ole db数据源,1、说明 目前在网络流行的小型数据库access,就应该使用ole db .net 数据提供程序来访问数据,该程序在system.data.oledb空间中定义。 使用ole db .net 数据提供程序与使用sql server.net数据提供程序的方式十分类似,需要注意的是连接字符串有所不同,连接到access数据库的字符串格式如下:provider=microsoft.jet.oledb.4.0;data source=mydb.mdb;user id=;password=; 前面两项为必须项,如果数据库没有密码,后面两者都可以省略,在实际项目

18、中,data source还必须转化为绝对路径,2、access连接实例,1)启动visual studio .net,新建一个windows应用程序。 (2)在表单form1中添加按钮btnconnection,属性设置同前面例子。 (3)在在form1.cs文件中添加名称空间 using system.data.oledb; (4)双击btnconnect控件,在click事件相关处理程序btnconnect_click中输入以下代码: (5)运行程序,try oledbconnection conn=new oledbconnection( ); string connstr=provi

19、der=microsoft.jet.oledb.4.0;data source=; connstr+=datadb.mdb; messagebox.show(当前连接字符串为:n+connstr+n); conn.connectionstring=connstr; conn.open( ); if(conn.state=connectionstate.open) messagebox.show(连接成功); conn.close() ; if(conn.state=connectionstate.closed) messagebox.show(关闭成功); catch( exception e

20、x) messagebox.show(连接失败,原因是:n+ex.message);,11.2.5 数据命令,建立数据连接之后,就可以执行数据访问操作和数据操纵操作了,一般对数据库的操作被概括为crud-create read update和delete。ado.net中定义command类去执行这些操作。 在.net中存在sqlcommand和oledbcommand两种类,两者类似,数据命令通常包括的内容有: 一个连接(connection):命令对象所使用的连接对象;使用它与数据库通信。 命令的名称或文本(commandtext):设置要对数据源执行的sql语句或存储过程。 命令类型(c

21、ommandtype):指明命令的类型,是存储过程还是普通sql文本; 参数(patameters):参数集合,可以分别设置或者读取这些参数,其中,commandtext的内容和commandtype有关,当类型为storeprocedure时, commandtext属性为存储过程的名称,当类型为tabledirect时, commandtext属性为要访问的表的名称,当类型为text时,则commandtext属性为sql语句。默认为text,1、 sqlcommand对象的创建 方法一: sqlcommand cmd=new sqlcommand( ); /创建命令对象 cmd.conn

22、ection=connectionobject;/将已有连接赋给命令对象 cmd.commandtext=commandtext;/将已有命名文本赋给命令对象 commandtext可以是从数据库检索数据的sql select语句: string commandtext=“select * from student”; 也可以是一个存储过程的名称: string commandtext=“getallstudent”; cmd.commandtype=commandtype.storeprocedure,方法二: 将命令文本放入构造函数作为参数: sqlcommand cmd=new sqlc

23、ommand(commandtext); cmd.connection=connectionobject; 方法三:直接将命名文本和连接对象放入构造函数 sqlcommand cmd=new sqlcommand(commandtext,connectionobject); 方法四:可以直接使用connection对象的createcommand方法 sqlcommand cmd=conn.createcommand( ); cmd.commandtext=“select id,sname from student,2、 sqlcommand对象的方法 sqlcommand对象提供了四个方法:

24、 executenonquery:执行不返回结果的命令,通常使用这个命令执行插入、更新或者删除操作; executescalar:执行返回单个值的命令; executereader:执行命令,将结果集填充datareader对象; executexmlreader: sqlcommand对象特有的方法,该方法执行将返回xml字符串的命令,返回一个包含所返回的xml的system.xml.xmlreader对象,1)executescalar方法执行返回单个值的命令,例如,想获取数据库中学生的总人数,可以使用这个方法执行sql查询:select count(*) from student。 ex

25、ecutescalar方法使用举例: (1)新建windows应用程序,在表单中加入按钮控件btngetcount,以及label 控件lblresult。 (2)双击btngetcount控件,输入以下代码: (3) 对代码中绿色部分进行修改,即可以完成对ole db数据库的操作,string commandtext=“select count(*) from student”; string connstring=“date source=(local);initial catalog=students;user id=sa;password=1234”; sqlconnection co

26、nn=new sqlconnection( ); conn.connectionstring=connstring; sqlcommand cmd=new sqlcommand(commandtext,conn); conn.open( ); string count=cmd.executescalar( ).tostring( ); conn.close( ); this.lblresult.text=“共有”+count+”学生,2)executenonquery方法主要用来更新数据,通常使用它来执行update、insert、delete语句。该方法返回值意义如下:对于update、in

27、sert、delete语句返回值为该命令所影响的行数,对于其它类型的语句,返回值为-1。 executenonquery方法使用举例: string updatequery=“update student set sname=小李”+”where id=200131500145”; sqlconnection conn=new sqlconnection( ); conn.connectionstring=connectionstring; sqlcommand cmd=new sqlcommand(updatequery,conn); conn.open( ); int recordsaff

28、ected=cmd.executenonquery( ); conn.close(,update、insert、delete语句中参数构造方式 在updatequery中的更新参数应该根据用户实际输入的信息进行处理,要达到这个目的就必须根据用户输入的数据来构造命令,构造命令有多种形式。 (1)字符串拼接方式 假设已经将用户输入的数据保存到了变量中: string username=“小李“; string user id=“200131500145”; 则命令可以构造如下: string updatequery=“update student set sname= ”+username+” ”

29、+”where id= “+user id+”,update、insert、delete语句中参数构造方式 (2)参数化方式 在sql server .net中指定参数 当命令文本在指定具体命令时,必须指出哪部分是参数,可变参数要加前缀。 update student set sname=username where id=user id string updatequery=“update student set sname=username”+”where id=user id”; sqlconnection conn=new sqlconnection(connectionstring)

30、; sqlcommand cmd=new sqlcommand(updatequery,conn,有了包含参数的command对象,需要为命令中的每一个参数创建一个parameter对象。sqlcommand类提供了一个parameters集合属性,用以为命令保存所有的参数。通过调用该集合的add方法,在集合中添加一个新的参数。 cmd.parameters.add(“username”,username); cmd.parameters.add(“user id”,user id); add方法中第一个参数为命令中的参数名,后面第二个参数则是用于定义的变量,保存了用户输入的信息。 带参数的命

31、令设置好后可以和往常一样执行executenonquery方法,在ole db .net中指定参数 ole db .net并不支持指定参数的方法,但是可以在查询中使用?来作为占位符来指定参数将出现的位置。 update student set sname=? where id=? 由于只是使用了占位符,在添加parameter对象时必须按照参数出现的顺序添加,如: oledbcommand cmd=new oledbcommand(updatequery,conn); cmd.parameters.add(“sname”,username); cmd.parameters.add(“id”,u

32、ser id); 此时username将会赋值给第一个参数,user id将会赋值给第二个参数,两句代码如果调换前后顺序,则user id的值赋值给第一个参数,username的值赋值给第二个参数,即add方法的第一个参数没有意义,更新记录举例,新建windows应用程序,将表单设计如下,表单中各个对象为label1,label2,textbox1,textbox2,button1,button2,在form1.cs中导入名称空间system.data.sqlclient,然后添加一个checkinfo方法,对输入的数据进行检查。 bool checkinfo( ) if(this.textb

33、ox1.text.trim( )=“”) messagebox.show(“学号不完整“); return false; else if(this.textbox2.text.trim( )=“”) messagebox.show(“姓名不完整”); return false; return true;,双击button1,输入以下代码: if(this.checkinfo( ) string username=this.textbox2.text.trim( ); string user id=this.textbox1.text.trim( ); sqlconnection conn=ne

34、w sqlconnection( ); conn.connectionstring=“data source=(local);initial catalog=student;user id=sa;password=1234”; string updatequery=“update student set sname=”+username+” “+”where id=”+user id+” ”; sqlcommand cmd=new sqlcommand(updatequery,conn,conn.open( ); int recordsaffected=com.executenonquery(

35、 ); conn.close( );,双击button2,输入以下代码: if(this.checkinfo( ) string username=this.textbox2.text.trim( ); string user id=this.textbox1.text.trim( ); sqlconnection conn=new sqlconnection( ); conn.connectionstring=“data source=(local);initial catalog=student;user id=sa;password=1234”; string updatequery=“

36、update student set sname=username where id=user id ”; sqlcommand cmd=new sqlcommand(updatequery,conn,cmd.parameters.add(new sqlparameter(“username”,username) cmd.parameters.add(new sqlparameter(“user id”,user id); conn.open( ); int recordsaffected=com.executenonquery( ); conn.close( );,添加记录示例代码,stri

37、ng insertquery=“insert into student (id,sname,sgrade,ssex,semail,sphone,saddress)”+ “values(2000131500145,小张,男,,” +宏博公寓)”; sqlconnection conn=new sqlconnection(connectionstring); sqlcommand cmd=new sqlcommand(insertquery,conn); conn.open( ); int recordsaffected=cmd.executenonquery( );

38、conn.close(,删除记录示例代码,string deletequery=“delete from student where id=200131500145”; sqlconnection conn=new sqlconnection(connectionstring); sqlcommand cmd=new sqlcommand(deletequery,conn); conn.open( ); int recordsaffected=cmd.executenonquery( ); conn.close(,11.2.6 数据阅读器,当执行返回结果集的命令时,需要一个方法从结果集中提取数

39、据。处理结果集的方法有两个:第一,使用数据阅读器;第二,同时使用数据适配器(data adapter)和数据集dataset。 数据阅读器datareader类最常见的用法是检索sql查询或存储过程返回记录,它是一个连接的、只向前的和只读的结果集。也就是说,当使用数据阅读器时,必须保持连接处于打开状态,而且只能从头到尾遍历记录集,不能在某条记录处停下来向回移动,记录是只读的,数据阅读器不提供任何修改数据库记录的方法,1.创建datareader对象,datareader类没有提供公有的构造函数,通常调用command类的executereader方法来返回一个datareader对象。 sql

40、command cmd=new sqlcommand(commandtext,connectionobject); sqldatareader reader=cmd.executereader( ); 当数据阅读器打开时,不能使用对应的连接对象执行其他任何任务;当阅读完数据阅读器的记录或不再需要数据阅读器时,应该立即关闭数据阅读器。 reader.close(,executereader方法执行可以带上在system.data空间中定义的commandbehavior枚举类型的参数,执行一些想要怎样使用结果的指令。 如下面的代码表示当关闭数据阅读器时数据连接也同时被关闭,无需再次关闭数据连接。

41、 sqldatareader reader=cmd.executereader(commandbehavior.closeconnection,2.遍历datareader对象中的记录,当executereader方法返回datareader对象时,当前光标的位置在第一条记录的前面,必须调用阅读器的read方法把光标移动到第一条记录,然后,第一条记录变成当前记录。如果数据阅读器包含的记录不止一条,read方法就返回一个boolean值true。想要移动到下一条记录,需要再次调用read方法。重复该过程指导最后一条记录,这时read方法将返回false。 经常使用while循环来遍历记录:whi

42、le(reader.read( ) 读取数据 只要read方法返回的值为true,就可以访问当前记录中包含的字段,3.访问字段中的值,有两种方法可以访问记录中的字段,第一种是item属性,此属性返回由字段索引或字段名指定的字段值;第二种是get方法,此方法返回由字段索引指定的字段的值。 (1)item属性 item属性是data reader类的索引,总是基于0开始编号的。可以把包含字段名的字符串传入item属性,也可以把指定字段索引的32位整数传递给item属性,如: 当执行完sql(select id,sname from student)查询后 使用以下任意方法都可以得到两个被返回字段的

43、值。 object id=reader“id”; object sname=reader“sname”; 或者 object id=reader0; object sname=reader1; 注意:在使用数据时,需要自己负责类型转换: int id=(int)reader0; 如果转换错误将抛出异常,2)get方法 每一个datareader类都定义了一组get方法,这些方法将返回适当类型的值。 在上面的例子中,还可以使用以下代码来访问字段的值: int id=reader.getint32(0); string sname=reader.getstring(1,datareader 实例 ()新建项目(windows应用程序)。 ()双击,进入事件。 ()在中添加命名空间。 ()在事件中添加代码,string message=“ “; oledbconnection conn=new oledbconnection() ; conn.connectionstring=provider=microsoft.jet.oledb.4.0;data source=“+ datastudent.mdb; string

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论