《CSharp数据库编程.ppt》由会员分享,可在线阅读,更多相关《CSharp数据库编程.ppt(58页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C#数据库编程 n 11.1 11.1 数据库编程基础数据库编程基础n n11.1.1 ADO.NET简介n n11.1.2 第一个简单例子n n11.1.3 访问数据库的一般步骤 n 11.1.1 ADO.NET 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
2、结构的核心组建,DataSet中包括一个或多个DataTable对象的集合,这些对象由数据行和数据列以及主键、外键、约束和有关DataTable对象中数据的关系信息组成。ADO.NET的另外一个核心元素是.NET Framawork数据提供程序,能够实现数据操作和对数据的快速访问。其中,Connection对象提供与数据源的连接;Command对象使你能够访问用于返回数据、修改数据、运行存储过程以及发送或检索参数信息的数据库命令;DataReader对象从数据源中提供高性能的数据流;DataAdapter对象提供连接DataSet对象和数据源的桥梁。目前,.NET Framawork附带了两个
3、数据提供程序:SQL Server 和OLE DB数据提供程序。OLE DB数据提供程序位于System.Data.OleDb空间,SQL Server 数据提供程序位于System.Data.SqlClient命名空间。以下是每个数据提供程序所包含的主要类:实现接口实现接口OLE DB提供程序SQL Server 提供程序ConnectionConnectionOleDbConnectionOleDbConnectionSqlConnectionSqlConnectionCommandCommandOleDbCommandOleDbCommandSqlCommandSqlCommandDat
4、aReaderDataReaderOleDb DataReaderOleDb DataReaderSql DataReaderSql DataReaderDataAdapterDataAdapterOleDb DataAdapterOleDb DataAdapterSql DataAdapterSql DataAdaptern11.1.2 11.1.2 第一个简单例子第一个简单例子 现在编写一个名为GetStudent的访问SQL SERVER数据库的控制台应用程序,对学生信息表中的信息进行读取(假设学生信息表已经建立)。using System;using System.Collection
5、s.Generic;using System.Data;using System.Data.SqlClient;namespace GetStudent class 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
6、=“Select ID,sName from student”;SqlDataReader reader=cmd.ExecuteReader();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 Syste
7、m;using System.Collections.Generic;using System.Data;using System.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
8、);(3)调用conn对象的Open方法打开数据库连接。conn.Open();(4)新建SqlCommand对象,该对象用于向数据库发出命令。通过调用数据库连接对象conn的CreateCommand方法来建立SqlCommand对象。SqlCommand cmd=conn.CreateCommand();(5)有了命令对象cmd后,指定该命令对象的属性CommandText。cmd.CommandText=“Select ID,sName from student”;(6)命令对象cmd设置完毕,可以向数据库发出命令,执行在CommandText中定义的操作。cmd对象的执行结果保存在Sq
9、lDataReader对象reader中。SqlDataReader reader=cmd.ExecuteReader();(7)在reader中已经保存了从数据库读取的信息,现在的任务是输出它们。从数据读取器中获取数据一般用while循环,Read()方法一直返回真值,直到reader的指针指向最后一条记录的后面。while(reader.Read()output=string.Format(“学生 0t的学号是1”,reader.GetString(1),reader.GetString(0);Console.Writeline(output);(8)数据读取以后,应该关闭数据读取器和数据
10、库连接对象。reader.Close();conn.Close();n 11.1.3 11.1.3 访问数据库的一般步骤访问数据库的一般步骤 从前面例子的分析中,得出通过ADO.NET访问数据库的一般步骤如下:(1)建立数据库连接对象(Connection对象);(2)打开数据库连接(Connection对象的Open方法);(3)建立数据库命令对象,指定命令对象所使用的连接对象(Command);(4)指定命令对象的命令属性(CommandText属性);(5)执行命令(Command的方法,如ExecuteReader);(6)操作返回结果(对SqlReaderData对象进行读取);(7
11、)关闭数据库连接。n 11.2.4 11.2.4 数据连接数据连接 在数据访问中必须建立到数据库的物理连接。每个数据提供程序都包含自己特有的Connection对象。当使用OLE DB数据提供程序时,要使用System.Data.OleDb空间的OleDbConnection对象,使用SQL Server 数据提供程序时,要使用位于System.Data.SqlClient命名空间的SqlConnection对象。在程序开始导入名称空间System.Data.SqlClient和System.Data.OleDb。n 11.2.4.1 11.2.4.1 连接连接SQL SERVERSQL SE
12、RVER数据源数据源 1、SqlConnection类SqlConnection类有两个构造函数,一个不带参数,一个接受连接字符串。可以使用以下两种方法进行实例化连接。string connStr=“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=stude
13、nts;user Id=sa;password=1234”;);conn.Open();注意:只有当一个连接关闭后才能把两外一个不同的连接字符串赋值给Connection对象。如果不知道该对象是打开的还是关闭的,可以检查对性的State属性,它的值可以是Open,也可以是Closed。BrokenBroken与数据源连接中断,可以关闭之与数据源连接中断,可以关闭之后再打开。后再打开。ClosedClosed处于关闭状态处于关闭状态ConnectingConnecting对象正与数据源连接对象正与数据源连接ExecutingExecuting对象正在执行命令对象正在执行命令FetchingFet
14、ching对象正在检索数据对象正在检索数据OpenOpen连接处于打开状态连接处于打开状态 2、连接字符串ConnectionString连接字符串包含由一些“属性名=值”对组成的集合,每个“属性名=值”对都由分号隔开。string connStr=“server=(local);Initial Catalog=students;user Id=sa;password=1234”;其中,server为服务器地址,值local表示使用本地机器。server关键字也可以用Data Source来代替,即字符串可以写成string connStr=“Data Source=(local);Initi
15、al 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表示连接时使用的是windows身份验证模式。3、SqlCon
16、nection的方法SqlConnection由自己的方法,如前面使用过的Open()和Closed()方法。其他方法还有:CreateCommand 创建并返回一个与SqlConnection关联的SqlCommand对象。ChangeDatabase 为打开的SqlConnection更改当前数据库。注意:数据库连接必须小心,应该在最晚的时候建立连接,在最早的时候关闭连接,以释放占用的内存和网络带宽资源。4、连接SQL SERVER的数据访问实例(1)启动visual ,新建一个windows 应用程序。(2)从工具栏中拖动一个Button控件到页面中,将ID设为btnconnect,Te
17、xt属性为“点击连接数据库”。(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;”;conn.Open();if(conn.State=ConnectionState.O
18、pen)MessageBox.Show(“连接已经打开”);conn.Close();if(conn.State=ConnectionState.Closed)MessageBox.Show(“连接已经关闭”);catch(Exception e)MessageBox.Show(“连接失败,原因可能是“+e.Message);5、按ctrl+f5运行项目,单击表单中的”点击连接数据库“按钮,如果数据库连接成功,则将依次弹出两个对话框。6、如果连接不成功,则会得到提示错误信息的页面。n 11.2.4.2 11.2.4.2 连接连接OLE DBOLE DB数据源数据源 1、说明目前在网络流行的小型
19、数据库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=;前面两项为必须项,如果数据库没有密码,后面两者都可以省略,在实际项目中,Data Source还必须转化为绝对路径。2 2、accessaccess连
20、接实例连接实例连接实例连接实例(1)启动visual ,新建一个windows应用程序。(2)在表单Form1中添加按钮btnconnection,属性设置同前面例子。(3)在在Form1.cs文件中添加名称空间using System.Data.OleDb;(4)双击btnConnect控件,在Click事件相关处理程序btnconnect_click中输入以下代码:(5)运行程序。tryOleDbConnection conn=new OleDbConnection();string connStr=Provider=Microsoft.Jet.OLEDB.4.0;Data Source=
21、;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 ex)MessageBox.Show(连接失败,原因是:n+ex.Message);n 11.2.5 11.
22、2.5 数据命令数据命令 建立数据连接之后,就可以执行数据访问操作和数据操纵操作了,一般对数据库的操作被概括为CRUD-Create Read Update和Delete。ADO.NET中定义Command类去执行这些操作。在.NET中存在SqlCommand和OleDbCommand两种类,两者类似。数据命令通常包括的内容有:一个连接(Connection):命令对象所使用的连接对象;使用它与数据库通信。命令的名称或文本(CommandText):设置要对数据源执行的SQL语句或存储过程。命令类型(CommandType):指明命令的类型,是存储过程还是普通SQL文本;参数(Patamete
23、rs):参数集合,可以分别设置或者读取这些参数。其中,CommandText的内容和CommandType有关,当类型为StoreProcedure时,CommandText属性为存储过程的名称,当类型为TableDirect时,CommandText属性为要访问的表的名称,当类型为Text时,则CommandText属性为SQL语句。默认为Text。1、SqlCommand对象的创建方法一:SqlCommand cmd=new SqlCommand();/创建命令对象cmd.Connection=ConnectionObject;/将已有连接赋给命令对象cmd.CommandText=Com
24、mandText;/将已有命名文本赋给命令对象CommandText可以是从数据库检索数据的SQL Select语句:string CommandText=“select*from student”;也可以是一个存储过程的名称:string CommandText=“GetAllStudent”;cmd.CommandType=CommandType.StoreProcedure;方法二:将命令文本放入构造函数作为参数:SqlCommand cmd=new SqlCommand(CommandText);cmd.Connection=ConnectionObject;方法三:直接将命名文本和连
25、接对象放入构造函数SqlCommand cmd=new SqlCommand(CommandText,ConnectionObject);方法四:可以直接使用Connection对象的CreateCommand方法SqlCommand cmd=conn.CreateCommand();cmd.CommandText=“Select ID,sName from student”;2、SqlCommand对象的方法SqlCommand对象提供了四个方法:ExecuteNonQuery:执行不返回结果的命令,通常使用这个命令执行插入、更新或者删除操作;ExecuteScalar:执行返回单个值的命令
26、;ExecuteReader:执行命令,将结果集填充DataReader对象;ExecuteXmlReader:SqlCommand对象特有的方法,该方法执行将返回XML字符串的命令,返回一个包含所返回的XML的System.Xml.XmlReader对象。1)ExecuteScalar方法执行返回单个值的命令,例如,想获取数据库中学生的总人数,可以使用这个方法执行SQL查询:Select count(*)from student。ExecuteScalar方法使用举例:(1)新建windows应用程序,在表单中加入按钮控件btnGetCount,以及label 控件lblResult。(2)
27、双击btnGetCount控件,输入以下代码:(3)对代码中绿色部分进行修改,即可以完成对OLE DB数据库的操作。string commandText=“select count(*)from student”;string connString=“Date Source=(local);Initial Catalog=students;user id=sa;password=1234”;SqlConnection conn=new SqlConnection();conn.ConnectionString=connString;SqlCommand cmd=new SqlCommand(c
28、ommandText,conn);conn.Open();string count=cmd.ExecuteScalar().ToString();conn.Close();this.lblResult.Text=“共有”+count+”学生!”;2)ExecuteNonQuery方法主要用来更新数据,通常使用它来执行Update、Insert、Delete语句。该方法返回值意义如下:对于Update、Insert、Delete语句返回值为该命令所影响的行数,对于其它类型的语句,返回值为-1。ExecuteNonQuery方法使用举例:string updateQuery=“UPdate stu
29、dent Set sName=小李”+”Where ID=200131500145”;SqlConnection conn=new SqlConnection();conn.ConnectionString=connectionString;SqlCommand cmd=new SqlCommand(updateQuery,conn);conn.Open();int RecordsAffected=cmd.ExecuteNonQuery();conn.Close();UpdateUpdate、InsertInsert、DeleteDelete语句中参数构造方式语句中参数构造方式在updateQ
30、uery中的更新参数应该根据用户实际输入的信息进行处理,要达到这个目的就必须根据用户输入的数据来构造命令,构造命令有多种形式。(1)字符串拼接方式假设已经将用户输入的数据保存到了变量中:string userName=“小李“;string user id=“200131500145”;则命令可以构造如下:string updateQuery=“Update student Set sName=”+userName+”+”Where ID=“+user id+”“;UpdateUpdate、InsertInsert、DeleteDelete语句中参数构造方式语句中参数构造方式(2)参数化方式l
31、 在SQL SERVER.NET中指定参数当命令文本在指定具体命令时,必须指出哪部分是参数,可变参数要加前缀。Update student Set sName=userName where ID=user idstring updateQuery=“Update student Set sName=userName”+”Where ID=user id”;SqlConnection conn=new SqlConnection(connectionString);SqlCommand cmd=new SqlCommand(updateQuery,conn);有了包含参数的Command对象,需
32、要为命令中的每一个参数创建一个Parameter对象。SqlCommand类提供了一个Parameters集合属性,用以为命令保存所有的参数。通过调用该集合的Add方法,在集合中添加一个新的参数。cmd.Parameters.Add(“userName”,userName);cmd.Parameters.Add(“user id”,user id);Add方法中第一个参数为命令中的参数名,后面第二个参数则是用于定义的变量,保存了用户输入的信息。带参数的命令设置好后可以和往常一样执行ExecuteNonQuery方法。l在OLE DB.NET中指定参数 OLE DB.NET并不支持指定参数的方法
33、,但是可以在查询中使用?来作为占位符来指定参数将出现的位置。Update student Set sName=?Where ID=?由于只是使用了占位符,在添加Parameter对象时必须按照参数出现的顺序添加,如:OleDbCommand cmd=new OleDbCommand(updateQuery,conn);cmd.Parameters.Add(“sName”,userName);cmd.Parameters.Add(“ID”,user id);此时userName将会赋值给第一个参数,user id将会赋值给第二个参数,两句代码如果调换前后顺序,则user id的值赋值给第一个参数
34、,userName的值赋值给第二个参数,即Add方法的第一个参数没有意义。更新记录举例更新记录举例新建WINDOWS应用程序,将表单设计如下:表单中各个对象为label1,label2,textbox1,textbox2,button1,button2。在Form1.cs中导入名称空间System.Data.SqlClient,然后添加一个CheckInfo方法,对输入的数据进行检查。bool CheckInfo()if(this.textbox1.Text.Trim()=“”)MessageBox.Show(“学号不完整“);return false;else if(this.textbox
35、2.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=new SqlConnection();conn.ConnectionString=“Data Source=(local);Initial Catalog=student;user id=
36、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();conn.Close();双击button2,输入以下代码:if(this.CheckInfo()string userName=this.textbox2.Text.Trim();string u
37、ser id=this.textbox1.Text.Trim();SqlConnection conn=new 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);cmd.Parameters.
38、Add(new SqlParameter(“userName”,userName)cmd.Parameters.Add(new SqlParameter(“user id”,user id);conn.Open();int RecordsAffected=com.ExecuteNonQuery();conn.Close();添加记录添加记录示例代码:string insertQuery=“Insert into student(ID,sName,sGrade,sSex,sEmail,sPhone,sAddress)”+“Values(2000131500145,小张,男,,”+”027-873
39、64884,宏博公寓)”;SqlConnection conn=new SqlConnection(connectionString);SqlCommand cmd=new SqlCommand(insertQuery,conn);conn.Open();int RecordsAffected=cmd.ExecuteNonQuery();conn.Close();删除记录删除记录示例代码:string deleteQuery=“Delete from student where ID=200131500145”;SqlConnection conn=new SqlConnection(conn
40、ectionString);SqlCommand cmd=new SqlCommand(deleteQuery,conn);conn.Open();int RecordsAffected=cmd.ExecuteNonQuery();conn.Close();n 11.2.6 11.2.6 数据阅读器数据阅读器 当执行返回结果集的命令时,需要一个方法从结果集中提取数据。处理结果集的方法有两个:第一,使用数据阅读器;第二,同时使用数据适配器(Data Adapter)和数据集DataSet。数据阅读器DataReader类最常见的用法是检索SQL查询或存储过程返回记录,它是一个连接的、只向前的和只
41、读的结果集。也就是说,当使用数据阅读器时,必须保持连接处于打开状态,而且只能从头到尾遍历记录集,不能在某条记录处停下来向回移动,记录是只读的,数据阅读器不提供任何修改数据库记录的方法。1.1.创建创建创建创建DataReaderDataReader对象对象对象对象DataReader类没有提供公有的构造函数,通常调用Command类的ExecuteReader方法来返回一个DataReader对象。SqlCommand cmd=new SqlCommand(CommandText,ConnectionObject);SqlDataReader reader=cmd.ExecuteReader(
42、);当数据阅读器打开时,不能使用对应的连接对象执行其他任何任务;当阅读完数据阅读器的记录或不再需要数据阅读器时,应该立即关闭数据阅读器。reader.Close();ExecuteReader方法执行可以带上在System.Data空间中定义的CommandBehavior枚举类型的参数,执行一些想要怎样使用结果的指令。如下面的代码表示当关闭数据阅读器时数据连接也同时被关闭,无需再次关闭数据连接。SqlDataReader reader=cmd.ExecuteReader(CommandBehavior.CloseConnection);2.2.遍历遍历遍历遍历DataReaderDataRe
43、ader对象中的记录对象中的记录对象中的记录对象中的记录当ExecuteReader方法返回DataReader对象时,当前光标的位置在第一条记录的前面,必须调用阅读器的Read方法把光标移动到第一条记录,然后,第一条记录变成当前记录。如果数据阅读器包含的记录不止一条,Read方法就返回一个Boolean值true。想要移动到下一条记录,需要再次调用Read方法。重复该过程指导最后一条记录,这时Read方法将返回false。经常使用while循环来遍历记录:while(reader.read()读取数据 只要Read方法返回的值为true,就可以访问当前记录中包含的字段。3.3.访问字段中的值
44、访问字段中的值访问字段中的值访问字段中的值有两种方法可以访问记录中的字段,第一种是Item属性,此属性返回由字段索引或字段名指定的字段值;第二种是Get方法,此方法返回由字段索引指定的字段的值。(1)Item属性Item属性是Data Reader类的索引,总是基于0开始编号的。可以把包含字段名的字符串传入Item属性,也可以把指定字段索引的32位整数传递给Item属性。如:当执行完SQL(select ID,sName from student)查询后 使用以下任意方法都可以得到两个被返回字段的值。object ID=reader“ID”;object sName=reader“sName”
45、;或者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 m
46、essage=“;OleDbConnection conn=new OleDbConnection();conn.ConnectionString=Provider=Microsoft.Jet.OLEDB.4.0;Data Source=“+Datastudent.mdb;string selectQuery=“select ID,sName,sGrade,sSex from student”;OleDbCommand cmd=new OleDbCommand(selectQuery,conn);conn.Open();OleDbDataReader reader=com.ExecuteRea
47、der(CommandBehavior.CloseConnection);while(reader.read()message+=“学号:”+reader0.ToString()+”“;message+=“姓名:”+reader“sName”.ToString()+”“;message+=“班级:”+reader.GetString(2)+”“;message+=“性别:“+reader.GetString(3)+”“;message+=“n”;reader.Close();if(conn.State=ConnectionState.Closed)message+=“数据连接已经关闭”;Mes
48、sageBox.Show(message);n 11.2.7 11.2.7 数据集数据集 数据集DataSet是非连接的、位于内存中的高速数据缓存区。DataSet主要依靠DataAdapter类来与数据库通信。可以把DataSet看成是内存中的数据库,一般使用DataAdapter类的Fill方法来填充DataSet。调用DataAdapter类的Fill方法时,该方法将隐式调用数据连接的Open()方法,填充完毕将自动关闭数据连接。如果在调用该方法之前已经显式调用了conn的Open方法,则在Fill方法调用以后不会自动调用conn的Close方法来关闭数据连接。以下代码将实现与DataR
49、eader中同样的功能:string message=“;OleDbConnection conn=new OleDbConnection();conn.ConnectionString=Provider=Microsoft.Jet.OLEDB.4.0;Data Source=“+Datastudent.mdb;string selectQuery=“select ID,sName,sGrade,sSex from student”;OleDbCommand cmd=new OleDbCommand(selectQuery,conn);OleDbDataAdapter da=new OleDb
50、DataAdapter();da.SelectCommand=cmd;DataSet result=new DataSet();da.Fill(result,”student”);for(int i=0;iresult.Tables“student”.Rows.Count;i+)message+=“学号:”+result.Tables0.Rowsi“ID”+”“;message+=“姓名:”+result.Tables0.Rowsi“sName”+”“;message+=“姓名:”+result.Tables0.Rowsi“sGrade”+”“;message+=“姓名:”+result.Ta