C程序设计及应用教程(WHUT课件)第9章数据库操作.ppt_第1页
C程序设计及应用教程(WHUT课件)第9章数据库操作.ppt_第2页
C程序设计及应用教程(WHUT课件)第9章数据库操作.ppt_第3页
C程序设计及应用教程(WHUT课件)第9章数据库操作.ppt_第4页
C程序设计及应用教程(WHUT课件)第9章数据库操作.ppt_第5页
已阅读5页,还剩86页未读 继续免费阅读

下载本文档

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

文档简介

1 第9章 ADO.NET与数据操作 9.1 ADO.NET简介 9.2 数据库与数据库访问工具 9.3 ADO.NET数据访问对象 9.4 数据绑定技术 9.5 DataGridView控件 9.6 数据处理 9.7 存储过程 9.8 语言集成查询(LINQ) 2 C#提供了强大、并且一致的数据库访问解决方案。 C#可以利用ADO.NET开发数据库应用程序。 数据访问操作的发展: 采用ODBC(开发式数据互连)数据访问形式。这种访问方式的前 提是,只要公司提供某个数据库的数据驱动程序,就可以在程序 中对这个数据库操作。但是这种方式只能对结构化数据操作,对 于非结构化数据无能为力。 采用OLE DB数据访问形式。该方式设计了一个抽象层,由抽象层 负责对不同类型的数据提供统一的形式,程序与数据源打交道均 经过抽象层。达到了对结构化、非结构化数据均能按统一的方式 进行操作。 采用ADO数据模型。该模型在OLE DB的基础上又重新设计了访问层 ,对高级语言编写的程序提供了统一的以“行”为操作目标的数 据访问形式。 采用ADO.NET数据访问模型。该模型重新整合OLE DB和ADO,并在 此基础上构造了新的对象模型。该模型既提供了保持连接的数据 访问形式,又提供了松耦合的、以DataSet对象为操作目标的数据 访问形式。 3 9.1 ADO.NET简介 l ADO.NET是在ADO(ActiveX Data Objects)基础上发展 的新一代数据存取技术,是微软.NET平台下提出的新的 数据访问模型。 l ADO.NET增强了对非连接编程模式的支持,并支持RICH XML。由于传送的数据都是XML格式的,因此任何能够读 取XML格式的应用程序都可以进行数据处理。 l ADO.NET交互的数据源可以是数据库,也能够是文本文件 、Excel表格或者XML文件。 l ADO.NET设计了一系列对各类数据的访问形式,并提供了 对应的类,类中提供了与对应数据交互的属性和方法, 我们可以通过这些属性和方法对各种数据进行存取操作 。 4 ADO.NET数据访问模型 VS2008开发环境下使用的是ADO.NET 2.0。 在ADO.NET 2.0中,数据提供程序(Data Provider)使用 统一的数据访问模型对各种数据库进行数据访问:例如 Oracle、SQL Server、DB2、Access等。 ADO.NET的数据提供程序能将不同类型的数据统一读入到 客户机的DataSet缓存中,或者用DataReader对象直接读 取数据记录。这样处理后,无论是那种数据源,都可以 使用统一的代码访问。 ADO.NET支持数据库的非连接模式的访问,减少了对数据 库的活动连接数目,减低了带宽,提高了存取效率。 5 ADO.NET的结构 分为两大部分: 数据集(DataSet):数据集是一个非在线,完全由内存表示的一系列数 据,可以被看作一份本地磁盘数据库中部分数据的拷贝。数据集完全 驻留内存,可以被独立于数据库地访问或者修改。当数据集的修改完 成后,更改可以被再次写入数据库,从而保留我们所做过的更改。数 据集中的数据可以由任何数据源(Data Source)提供,比如SQL Server 或者Oracle。 数据提供源(Data Provider):用于提供并维护应用程序与数据库之 间的连接。 数据提供源是一系列为了提供更有效率的访问而协同工作 的组件。 DataSet对象是一个用可以XML形式表 示的数据视图,是一种数据关系视图。 6 数据库连接方式: 一种方式是直接和数据库连接:使用Command对象访问 数据库,通过DataReader对象读取数据。这种方式的优 点是不用占用本地额外的内存,而是读取数据的速度比 较快。 另一种方式是将数据缓存DataSet中:使用DataAdapter 对象访问数据库。采用这种方式是需要占用额外的内存 ,并且读取数据的速度相对前一种方式比较慢。 7 .NET Framework常见数据提供程序: l 用于 SQL Server 的数据提供程序, 提供对 Microsoft SQL Server 7.0 或更高版本中数据的访问。 使用 System.Data.SqlClient 命名空间。 l 用于 OLE DB 的数据提供程序: 提供对使用 OLE DB 公开的 数据源中数据的访问。 使用 System.Data.OleDb 命名空间 。 l 用于 ODBC 的数据提供程序:提供对使用 ODBC 公开的数据 源中数据的访问。 使用 System.Data.Odbc 命名空间。 l 用于 Oracle 的数据提供程序: 适用于 Oracle 数据源。 支持 Oracle 客户端软件 8.1.7 和更高版本,并使用 System.Data.OracleClient 命名空间。 l EntityClient 提供程序:提供对实体数据模型 (EDM) 应用 程序的数据访问。 使用 System.Data.EntityClient 命名空 间。 l 本教材只讲与SQL Server的连接。 8 9.2 数据库与数据库访问工具 9.2.1 SQL Server 数据库的分类 VS2008中有3种与SQL Server数据库的连接形式,分别为“SQL Server”、“SQL Server Compact 3.5”和“SQL Server数据库文 件”。 1Microsoft SQL Server 该选项用于和远程服务器上的数据库连接。 2Microsoft SQL Server数据库文件 该选项用于和SQL Server Express数据库文件建立连接。 3Microsoft SQL Server Compact 3.5 SQL Server Compact 3.5是一个更简单的SQL Server数据库版 本,数据库扩展名为.sdf,该版本是基于文件的数据库,而不 是基于服务的数据库,这种类型的数据库一般用于移动设备应 用程序。 9 本地数据库文件 本地数据库文件分类: 本地数据库文件:概念:存放在本地机器中的数据库文件 本地数据库文件:分类 本地数据库:Access.MDB文件, SQL Server Compact 3.5 的sdf文件 基于服务的数据库:SQL Server的.mdf文件 本地数据库文件属性设置: 项目中本地数据库文件的【复制到输出目录】属性的默认值如下 : (1)对于.sdf文件,其默认值为“如果较新则复制”,不变。 (2)对于.mdf文件,其默认值为“始终复制”改为“如果较新则 复制”。能够避免数据文件在下次运行时又被旧数据覆盖的问题 。 10 9.2.2 数据访问可视化工具 1服务器资源管理器:查看和操作位于数据库服务器上的数据链接、数据 库连接和系统资源(库、表、存储过程等)。 2数据集设计器:是一套可视化工具,用于创建和编辑类型化数据集和组 成数据集的各个项。 “数据集设计器”提供类型化数据集所包含对象 的可视表示形式。可以使用“数据集设计器”创建和修改 TableAdapter、TableAdapter 查询、DataTable、DataColumn 和 DataRelation。 3数据源: “数据源”窗口显示项目中的数据源。 数据源表示可用于应 用程序的数据。 可以使用“数据源”窗口在用户界面中创建数据绑定 的控件,方法是将各个项从该窗口拖动到项目中的设计。 使 用 流 程 11 12 本章选用示例数据库 数据库MyDatabase.mdf 数据表:见P235页定义 MyTable1学院编码对照表 MyTable2基本情况表 MyTable3家庭成员表 数据类型说明: char、Varchar Nchar、Nvarchar Datetime Image、Binary、VarBinary Text、NText 13 9.3 ADO.NET数据访问对象 ADO.NET提供了多种对象模型,这些对象提供了对数据库的各 种不同的访问功能: (1) Connection对象 (2) Command对象 (3) DataReader对象 (4) DataAdapter对象 (5) Parameter对象 (6) Transaction对象 对于不同的数据库,对象区别仅是前缀不同,例如: SQL Server数据库:SqlConnection、SqlDataAdapter Oracle数据库:OracleConnection、OracleDataAdapter 14 9.3.1 Connection对象 访问数据库的第一步是建立应用程序与数据库的链接 ADO.NET使用Connection对象与数据库进行连接。 Connection对象的常用属性和方法: ConnectionString属性:链接SQL数据库的形式: Database属性:数据库名称 Open 方法:使用ConnectionString所在指定的属性设 置打开的数据库连接 Close方法:关闭数据库,这是所有关闭数据库的首选 方法 15 9.3.1 Connection对象 连接字符串的常用形式有两种: (1)使用Windows集成安全身份验证,例如: string connectionString = “Integrated Security=SSPI; Database=MyDatabase.mdf; Server=localhost;“; (2)使用用户名、密码形式,例如: string connectionString = “ server=localhost; uid=sa; pwd=123; database=MyDatabase.mdf”; 但是这种连接方式的安全性不高,比较容易受到黑客的攻击 16 9.3.1 Connection对象(续) 可通过连接字符串直接创建Connection对象, 例如: SqlConnection conn = new SqlConnection(connString); 或者: SqlConnection conn = new SqlConnection(); conn.ConnectionString = connString; 说明: (1)为了简化书写,还需要在代码中添加对命名空间的引用: using System.Data.SqlClient; (2)为了简化代码,一般把ConnectionString定义在app.config中。 17 在C#中读取: /读取连接字符串 String connectionString = Properties.Settings.Default.MyDatabaseConnectionString; 18 9.3.2 Command对象 在ADO.NET中,有两种操作数据库的方式: (1)采用无连接的方式。 (2)采用保持连接的方式。 不论采用哪种方式,都可以通过SqlCommand对象提供的方 法传递对数据库操作的命令,并返回命令执行的结果。 19 9.3.2 Command对象(续) 在保持连接的方式下操作数据库的一般步骤为: 1) 创建Connection的实例; 2) 创建Command的实例; 3) 打开连接; 4) 执行命令; 5) 关闭连接。 Command对象: 允许对数据库进行操作,建立连接后,可通过该对象对数据库下 达命令(增删改等。 Command对象的属性及其方法如下: 20 1. ExecuteNonQuery 该方法执行SQL语句的结果,但不返回命令执行的表数据 ,仅返回操作所影响的行数。 2. ExecuteReader:返回一个SqlDataReader对象。 3. ExecuteScaler(): 该方法用于执行SELECT查询,得到的返回结果为一个值 的情况,比如使用count函数求表中记录个数或者使用sum函数求和等。 21 SQL语句种类: SQL语句种类: DML语句:来操纵数据库,如Select语句,delete语句,update语句, 分带参数和不带参数DML语句 存储过程:如UpdateRTS3 ,分带参数和不带参数的存储过程 参数处理的方法:SqlParameter对象 参数使用方法: /声明一个参数,参数不分大小写 SqlParameter parameter = cmd.Parameters.Add( “CategoryName“, SqlDbType.NVarChar, 15); /为参数赋值 parameter.Value = “Beverages“; 或者: cmd.Parameters.Add( “CategoryName“, SqlDbType.NVarChar, 15); cmd.Parameters“CategoryName”.Value= “Beverages“; 22 或者: /用New关键字创建新的参数对象 SqlParameter p=New SqlParameter(); p.ParameterName=CustomerID; p.Value=“ALFKI”; cmd.Parameters.Add(p); 参数方向: Input:参数是输入参数,可省略。 Output:参数是输出参数。 InputOutput:参数既能输入,也能输出。 ReturnValue:参数表示存储过程的返回值。 SqlParameter p1=New SqlParameter(); SqlParameter p2=New SqlParameter(); p1.Direction=ParameterDirection.Output; p2.Direction=ParameterDirection.Input; 23 存储过程: 可以利用SqlCommand对象调用存储过程 将SqlCommand对象的CommandText属性设置为存储过程名; 将CommandType属性设置为CommandType.StoredProcedure; 若有参数,向SqlCommand对象的Parameters集合中添加 SqlParameters,其中对应的存储过程中的输入输出参数只要正确设 置参数的Dirction属性即可。 示例: CREATE PROCEDURE AddStudent (Name nchar(10),Sex nchar(10),Age smallint,Address nchar(50),Married bit,Email nvarchar(50) AS INSERT INTO Class1 (Name,Sex,Age,Address,Married,Email) VALUES (Name,Sex,Age,Address,Married,Email) RETURN 24 使用: SqlConnection sc = new SqlConnection(“Data Source= (local);Integrated Security=SSPI;“ + “Initial Catalog=StudentInf“); SqlCommand cmd = new SqlCommand(“AddStudent”,sc); cmd.CommandType=CommandType.StoredProcedure; SqlParameter paraName = new SqlParameter(“Name“,SqlDbType.NChar,10); paraName.Value=Name; cmd.Parameters.Add(paraName); /其他参数。 try sc.Open(); cmd.ExecuteNonQuery(); sc.Close(); catch(Exception ex) MessageBox.Show(ex.Message); 25 9.3.2 SqlCommand对象(续) 【例9-2】演示SqlCommand对象的用法。 26 9.3.3 DataAdapter对象 DataAdapter对象表示一组 SQL 命令和一个数据库连接,它们用于填 充 DataSet和更新数据源。 DataAdapter对象通过无连接的方式完成数据库和本地DataSet之间的 交互。一般步骤: 1) 创建Connection的实例; 2) 创建DataAdapter的实例,需要的话,根据select语句生成其他 SQL语句; 3) 创建DataSet的实例; 4) 使用Fill方法将数据库中的表填充到DataSet表中; 5) 利用DataGridView或者其他控件对象编辑或显示数据; 6) 需要的话,使用Update方法更新数据库。 27 9.3.3 DataAdapter对象(续) DataAdapter 用作 DataSet 和数据源之间的桥接器以便检索和保存数据。 DataAdapter 通过映射Fill(这更改了 DataSet 中的数据以便与数据源中 的数据相匹配)和Update(这更改了数据源中的数据以便与 DataSet 中的 数据相匹配)来提供这一桥接器。 DataAdapter对象通过SelectCommand、Insert Command、UpdateCommand和 DeleteCommand属性为后台数据库提供对应的操作命令,并传递需要的参数 。 一般情况下,只需要提供SELECT语句和连接字符串创建SqlDataAdapter对 象,然后利用SqlCommandBuilder对象生成InsertCommand、UpdateCommand 和DeleteCommand属性。 28 DataAdapter 主要方法: Fill方法: Fill(DataSet) 创建名为Table的数据表,并用数据源返回的 行填充它 Fill(DataTable) 用数据源返回的行填充指定的数据表 Fill(DataSet,tableName) 用数据源返回的行填充指定的数据 集里名为tableName的数据表 Fill(DataTable,DataReader) 使用指定的DataReader填充数据 表 29 Update方法: Update(DataSet) 根据指定DataSet中名为Table的数据表 更新数据源 Update(dataRows) 根据指定dataRows数组更新数据源 Update(DataTable) 根据指定DataTale更新数据源 Update(dataRows,DataTableMapping) 使用指定的 DataTableMapping,根据指定的dataRows数组更新数据源 Update(DataSet,sourceTable) 根据DataSet的 sourceTable中指定的数据表更新数据源 30 在ADO.NET中,Insert、Update、Delete命令可以自动生成并暴露 给数据适配器。 数据适配器要通过命令生成器的构造函数与生成器进行关联。如下 所示: SqlCommand cmd =new SqlCommand(); cmd.CommandText = “Select employeeid, lastname From employees”; cmd.Connection = conn; adapter.SelectCommand = cmd; SqlCommandBuilder builder =new SqlCommandBuilder(adapter); adapter.InsertCommand = builder.GetInsertCommand(); adapter.DeleteCommand = builder.GetDeleteCommand(); adapter.UpdateCommand = builder.GetUpdateCommand(); 31 9.3.3 SqlDataAdapter对象(续) 【例9-3】根据选择的表名打开数据库表,并将表中数据通过 DataGridView显示出来。 设计界面如下: 32 9.3.4 DataTable对象 ADO.NET可以在与数据库断开连接的方式下通过DataSet或 DataTable对象进行数据处理,当需要更新数据时才重新 与数据源进行连接,并更新数据源。 DataTable对象表示保存在本机内存中的表,它提供了对 表中行、列数据对象的各种操作。可以直接将数据从数据 库填充到DataTable对象中,也可以将DataTable对象添加 到现有的DataSet对象中。 33 9.3.4 DataTable对象(续) 在断开连接的方式下,DataSet对象提供了和关系数据库一样的 关系数据模型,代码中可以直接访问DataSet对象中的DataTable 对象,也可以添加、删除DataTable对象。 34 9.3.4 DataTable对象(续) 【例9-4】自定义一个DataTable对象,直接创建行列信息,并 在DataGridView中显示创建的内容。 35 9.3.5 DataSet对象 1. 创建DataSet对象 使用创建的DataSet对象可以完成各种数据操作。 2. 填充DataSet对象 创建DataSet后,就可以使用SqlDataAdapter对象把数据导入 到DataSet对象中,比如通过Fill方法将数据填充到DataSet中 的某个表中。 36 1. 把数据库中的数据通过DataAdapter对象填充DataSet: SqlConnection sqlConnection1 = new SqlConnection ( “Data Source=localhost ;Integrated Security=SSPI ;Initial Catalog=Northwind“ ) ; /创建数据连接 SqlCommand selectCMD = new SqlCommand ( “SELECT CustomerID , CompanyName FROM Customers“ , sqlConnection1 ) ; /创建并初始化SqlCommand对象 SqlDataAdapter sqlDataAdapter1 = new SqlDataAdapter ( ) ; custDA.SelectCommand = selectCMD ; sqlConnection.Open ( ) ; /创建SqlDataAdapter对象,并根据SelectCommand属性检索数据 DataSet dsDataSet1 = new DataSet ( ) ; sqlDataAdapter1.Fill ( dsDataSet1 , “Customers“ ) ; /使用SqlDataAdapter的Fill方法填充DataSet sqlConnection.Close ( ) ; /关闭数据连接 37 2. 通过DataAdapter对象操作DataSet实现更新数据库: /以sqlDataAdapter1为参数来初始化SqlCommandBuilder实例 SqlCommandBuilder sqlCommandBuilder1 = new SqlCommandBuilder ( sqlDataAdapter1 ) ; /删除DataSet中删除数据表Customers中第一行数据 dsDataSet1.Tables“Customers“.Rows0.Delete ( ) ; /调用Update方法,以DataSet中的数据更新从数据库 sqlDataAdapter1.Update ( dsDataSet1 ,“Customers“ ) ; dsDataSet1.Tables“Customers“.AcceptChanges ( ) ; 方法 AcceptChanges 能够提交所有正在进行的更改。它使得数据集 会将当前值接受为新的原始值。因此,所有挂起的更改都被清除。与 RejectChanges 一样,也可以对整个数据集、某个表或某个行调用 AcceptChanges。 一旦批处理更新操作成功完成,您必须调用 AcceptChanges 来清除挂起的更改,并将当前数据集值标记为原始值。注 意,如果省略了最后对 AcceptChanges 的调用,数据集中则会保留挂起的 更改,从而导致在下次进行批处理更新时重新发出这些更改。 38 3. XML和DataSet: DataSet中的数据可以从XML数据流或文档创建。并且.Net Framework可以控制加载XML数据流或文档中那些数据以及如 何创建DataSet的关系结构。 加载XML数据流和文档到DataSet中使用DataSet对象的 ReadXml方法(注意:ReadXml来加载非常大的文件,则性能 会有所下降)。 39 9.4 数据绑定技术 数据绑定是指在程序运行时,窗体上的控件自动将其属性和 数据源关联在一起。 数据绑定技术是数据操作中使用最频繁的技术,利用数据绑 定技术能极大地提高项目开发的效率。 与数据绑定有关的技术: 简单数据绑定与复杂数据绑定。 数据源组件。 导航控件。 40 9.4.1 简单数据绑定与复杂数据绑定 Windows窗体提供了两种类型的数据绑定:简单数据绑定和复 杂数据绑定。 1.简单数据绑定指将一个控件的某个属性绑定到单个值。这种 类型的绑定适用于只显示单个值的控件,一般将这些控件绑 定到数据库中某个记录的一个字段。比如TextBox等控件。 2.复杂数据绑定指将一个控件绑定到多个值。这种类型的绑定 适用于显示多个值的控件,例如DataGridView控件、 ListBox控件和ComboBox控件等。 41 9.4.1 简单数据绑定与复杂数据绑定 从实现数据绑定的方式上,有3种实现方法: 在设计界面下通过鼠标拖放实现常用属性的数据绑定; 在设计界面下设置控件的DataBindings属性,然后利用可 视化界面实现各种属性的数据绑定; 直接编写代码实现数据绑定。 实际上,不论采用哪种方式,从本质上来讲,都是利用 BindingSource组件来实现数据绑定的。 42 9.4.1 简单数据绑定与复杂数据绑定 1通过鼠标拖放实现数据绑定 对于比较简单的数据库应用,大部分情况下,都可以在设计界 面下通过鼠标拖放完成绑定功能。常用方式有: 将【数据源】中的数据表字段直接拖放到设计窗体上,让系 统自动创建和该表字段绑定的控件。 将【数据源】中的表直接拖放到设计窗体上,让系统自动创 建和该表绑定的控件。 将【数据源】中的字段直接拖放到窗体上已有的控件上,该 控件即自动绑定到拖放的表字段。 43 9.4.1 简单数据绑定与复杂数据绑定 2通过设置控件的属性实现数据绑定 工具箱中提供的每个控件,都有一个【DataBindings】属性 ,用于绑定数据源。 利用它实现数据绑定的步骤如下。 (1)在窗体中,选择该控件并显示属性窗口,然后展开【 (DataBindings)】属性,此时即看到与控件对应的默认绑定 属性。实际上,用鼠标拖放所绑定的属性都是自动绑定到默 认的属性。 (2)单击【(Advanced)】属性右边的“”按钮,显示“ 格式设置和高级绑定”对话框,再此对话框中,选择要绑定 的数据源和被绑定的属性即可。 44 9.4.1 简单数据绑定与复杂数据绑定 3直接编写代码实现数据绑定 如果程序员希望灵活地控制绑定的数据库表字段,也可以直接 编写绑定代码。采用这种方式实现数据绑定的步骤如下。 从【工具箱】中拖放一个BindingSource组件、一个自动生 成的强类型的DataSet组件、一个强类型的DataAdapter组件 到设计窗体上。如果窗体上已经有这些对象,则不需要此步 骤; 从【工具箱】中拖放一个被绑定的控件到设计窗体上,修改 控件的【Name】属性为有意义的名称。 添加绑定代码。 45 9.4.1 简单数据绑定与复杂数据绑定 【例9-5】演示常用控件的数据绑定方法。 46 9.4.2 BindingSource组件 1、BindingSource组件 用统一的数据绑定中间层绑定不同数据源。 用法: (1)将BindingSource组件绑定到实际数据源 (2)将控件绑定的数据源设置为BindingSource组件 47 9.4.2 BindingSource组件(续) BindingSource组件常用的属性主要有: 1) DataSource属性:获取或设置绑定到BindingSource的 数据源。 2) Sort属性:获取或设置数据源中各列的排序字符串。 3) Filter属性:获取或设置数据源中记录筛选条件字符串 。 4) Current属性:指绑定列表中的当前项。 48 9.4.2 BindingSource组件(续) 【例9-6】设计一个Windows应用程序,显示本机当前支持的所 有字体。 左图为设计界面,右图为运行效果。 49 9.4.3 BindingNavigator组件 BindingNavigator组件同时提供了两种功能: (1)提供了对窗体中的数据进行导航控制和常用数据操作的 方法 (2)提供了一个ToolStrip控件形式的导航条。 常用属性: 1) BindingSource:指定组件所要绑定的BindingSource对象。 2) Dock:确定BindingNavigator组件提供的ToolStrip在窗体设 计器中的位置。 50 9.4.3 BindingNavigator组件 【例9-7】设计一个Windows窗体应用程序,自动将 MyDatabase.mdf中包含的所有表的名称显示出来供用户选择 ,同时在界面中提供记录导航和添加、删除等功能,并能保 存修改后的结果。 左图为设计效果,右图为运行效果。 51 9.5 DataGridView控件 DataGridView是用于Windows Froms 2.0的新网格控件。通过 DataGridView控件,可以显示和编辑表格式的数据,而这些数据可 以取自多种不同类型的数据源。DataGridView控件提供了大量的属 性、方法和事件,可以用来对该控件的外观和行为进行自定义。 52 1. DataGridView的亮点 53 9.5 DataGridView控件 2.绑定数据源 利用DataGridView控件操作数据库中的数据时,一般都是利用 数据绑定技术来实现。步骤如下。 (1)将数据库中的表数据读到DataSet或者DataTable中; (2)创建一个BindingSource对象,将BindingSource对象绑 定到DataSet或者直接绑定到DataTable; (3)将DataGridView绑定到BindingSource对象。 54 private void showData() try OracleConnection conn = new OracleConnection(ConnectionString); conn.Open(); OracleDataAdapter da = new OracleDataAdapter(string.Format(“SELECT Inventory_No,CK_no,CK_name,Start_Time,InventoryMans,Insert_Time,“+ “Other From T_BJ_Inventory Where ProfitOrLoss is null And Inventory_No like %0% order by Inventory_No“, Inventory_No.Text), conn); DataSet ds = new DataSet(); da.Fill(ds); bindingSource1.DataSource = ds.Tables0; this.bindingNavigator1.BindingSource = bindingSource1; this.dataGridView1.DataSource = bindingSource1; catch (Exception ex) MessageBox.Show(ex.ToString(); finally conn.Dispose(); conn.Close(); ds.Dispose(); 55 9.5 DataGridView控件 【例9-8】演示DataGridView常用功能。 设计界面如下: 56 9.6 数据处理 9.6.1 图像数据处理 1利用SQL语句实现图像导入导出 (1)导入图片 string connString = Properties.Settings.Default.MyDatabaseConnectionString; string sql = “update MyTable2 set 照片=Photo where 姓名=StudentName“; using (SqlConnection conn = new SqlConnection(connString) SqlCommand cmd = new SqlCommand(sql, conn); cmd.Parameters.Add(“StudentName“, SqlDbType.NVarChar).Value = “王小琳“; OpenFileDialog openFileDialog1 = new OpenFileDialog( ); if (openFileDialog1.ShowDialog( ) = DialogResult.OK) Stream myStream = openFileDialog1.OpenFile( ); /保存图图像到myStream byte bt = new bytemyStream.Length; /定义义字节节流数组组 myStream.Read(bt, 0, (int)myStream.Length);/保存图图像到字节节流数组组 cmd.Parameters.Add(“Photo“, SqlDbType.Image).Value = bt; conn.Open( ); cmd.ExecuteNonQuery( ); myStream.Dispose( ); 57 9.6.1 图像数据处理 (2)导出图片 string connString = Properties.Settings.Default.MyDatabaseConnectionString; string sql = “select 照片 from MyTable2 where 姓名=StudentName“; using (SqlConnection conn = new SqlConnection(connString) SqlCommand cmd = new SqlCommand(sql, conn); cmd.Parameters.Add(“StudentName“, SqlDbType.NVarChar).Value = “王小琳“; conn.Open( ); SqlDataReader dr = cmd.ExecuteReader( ); if (dr.Read( ) if (dr0.GetType( ) != typeof(DBNull) byte bs = (byte)dr0; /保存dr0中的图图像到字节节流数组组bs中 MemoryStream ms = new MemoryStream(bs); /定义义内存流数组组 Bitmap image = new Bitmap(ms); /定义义Bitmap Graphics g = this.CreateGraphics( ); g.DrawImage(image, 10, 10);/显示Bitmap g.Dispose( ); ms.Dispose( ); 58 9.6.1 图像数据处理 2利用PictureBox控件实现图像导入导出 【例9-12】演示数据库中图像数据的处理方法。 设计界面如下: 59 9.6.2 关联表数据处理 假如:在数据库StudentDB中,在显示表Student和Score时,希望选中 某个学生时,表Score只显示此学生的成绩,两个表的这种关系叫做 主从关系(关联表)。 【例9-13】利用DataGridView完成对学生人员基本信息的所有数据编 辑操作,包括添加、删除、保存以及对照片和家庭人员情况的处理 ,同时显示学院编码和编码对应的名称,当用户选择名称时,自动 修改对应的编码。 设计界面: 60 9.6.2 关联表数据处理(自学) 运行界面: 61 9.7 存储过程 存储过程是指将常用的或复杂的数据库操作,预先用SQL 语句写好并用一个指定的名称存储起来,以后需要完成与已定 义好的存储过程的功能相同的数据库操作时,只需调用存储过 程的名称即可。 存储过程具有以下优点: 存储过程编辑器事先对存储过程进行了语法检查处理,避 免了因SQL语句语法不正确引起运行时出现异常的问题; 只在保存存储过程时数据库服务器才进行编译。 62 9.7 存储过程(续) 在定义或编辑存储过程的时候,可以直接检查运行结果是 否正确,提高了开发效率; 避免了查询字符串中包含单引号可能会出现的问题; 一个项目中可能会多处用到相同的sql语句,使用存储过 程便于重用; 修改灵活方便,当需要修改完成的功能时,只需要修改定 义的存储过程即可,而不必单独修改每一个引用。 63 9.7 存储过程 1.创建和修改存储过程 在VS2008开发环境下,利用【服务器资源管理器】,除了可以直接创 建SQL Server数据库和数据库中的表以外,还可以直接创建或修改 存储过程。 2.在存储过程中定义参数 存储过程可以带参数,也可以不带参数。 利用SqlCommand对象的Parameters属性提供的功能,可以传递执行 存储过程所用的参数。SQL Server的存储过程如果带参数,参数名 必须以“”为前缀。 参数的方向: Input:参数是输入参数,可省略。 Output:参数是输出参数。 InputOutput:参数既能输入,也能输出。 ReturnValue:参数表示存储过程的返回值。 64 9.7 存储过程 3利用SqlDataAdapter或者SqlCommand调用存储过程 在程序中利用SqlDataAdapter或者SqlCommand调用存储过 程时,和定义存储过程中参数的定义一样,程序中也必须指 明参数名、参数类型和参数方向。如果参数方向是输入参数 ,可以省略参数方向,其他情况均不能省略。 参数名不区分大小写,参数类型用SqlDbType枚举表示。 4利用数据集设计器调用存储过程 将存储过程变为强类型的对象,这样编译器就可以在编译 期间检查所有可能出现的错误。 具体实现办法是,将存储过程从【服务器资源管理器】中 直接拖放到数据集设计器中,让系统自动生成对应的组件, 并自动生成对应的调用方法。 65 9.7 存储过程 【例9-14】演示存储过程的用法。 设计界面: 66 9.8 语言集成查询(LINQ) 9.8.1 LINQ简介 LINQ(Language Integrated Query)是一组技术的统称。其主要思想是 ,它将各种查询功能直接集成到C#语言中,即用C#语法编写查询语句,而 不是用针对特定数据库的SQL语法。 LINQ是Visual Studio 2008中的领军人物。借助于LINQ技术,我们可以使 用一种类似SQL的语法来查询任何形式的数据。到目前为止LINQ所支持的数 据源有SQL Server、XML以及内存中的数据集合。开发人员也可以使用其提 供的扩展框架添加更多的数据源,例如MySQL、Amazon甚至是Google Desktop。 LINQ的好处: 1、无需复杂学习过程即可上手 2、编写更少代码即可创建完整应用。 3、更快开发错误更少的应用程序。 4、无需求助奇怪的编程技巧就可合并数据源。 5、让新开发者开发效率更高。 67 9.8 语言集成查询(LINQ) 学习LINQ的关键主要有两点: 查询表达式,用C# 3.0开始提供的语法编写; 对象关系设计器(O/R设计器),其形式有些类似于数据集设计器。 所有LINQ查询操作都由以下三部分组成: (1)获取数据源。 (2)定义查询表达式,并将查询表达式保存在某个查询变量中。 (3)利用查询变量执行查询。 68 9.8.1 LINQ简介 显示查询结果的办法主要有: (1)调用查询变量的属性或方法获取进一步的结果。 (2)在foreach语句中,通过遍历查询变量得到所有查询结果 。 (3)用数据绑定显示查询结果,即将BindingSource绑定到查 询变量,再将控件绑定到BindingSource,然后在窗体上将 结果显示出来。 69 9.8.1 LINQ简介 1查询数组 /创建数据源 int scores = new int 97, 92, 81, 60 ; /定义查询表达式 var query = from score in scores where score 80 select score; /执行查询 Console.WriteLine(“显示查询结果:“); foreach (int i in query) Console.Write(i + “, “); 70 9.8.1 LINQ简介 2查询数据库 /前提:(1)在项目中新建一个名为MyDatabaseClasses.dbml的“LINQ to SQL类“文 件 / (2)双击MyDatabaseClasses.dbml打开O/R设计器 / (3)从服务器资源管理器中将MyTable1拖到O/R设计器中 MyDatabaseClassesDataContext context=new MyDatabaseClassesDataContext( ); /定义查询表达式 var query = from table in context.MyTable1 select table; /执行查询 Console.WriteLine(“记录数:0“, query.Count( );

温馨提示

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

评论

0/150

提交评论