C程序设计及应用教程(WHUT课件)第9章数据库操作.ppt

上传人:max****ui 文档编号:6330638 上传时间:2020-02-23 格式:PPT 页数:91 大小:1.56MB
返回 下载 相关 举报
C程序设计及应用教程(WHUT课件)第9章数据库操作.ppt_第1页
第1页 / 共91页
C程序设计及应用教程(WHUT课件)第9章数据库操作.ppt_第2页
第2页 / 共91页
C程序设计及应用教程(WHUT课件)第9章数据库操作.ppt_第3页
第3页 / 共91页
点击查看更多>>
资源描述
第9章ADO NET与数据操作 9 1ADO NET简介9 2数据库与数据库访问工具9 3ADO NET数据访问对象9 4数据绑定技术9 5DataGridView控件9 6数据处理9 7存储过程9 8语言集成查询 LINQ C 提供了强大 并且一致的数据库访问解决方案 C 可以利用ADO NET开发数据库应用程序 数据访问操作的发展 采用ODBC 开发式数据互连 数据访问形式 这种访问方式的前提是 只要公司提供某个数据库的数据驱动程序 就可以在程序中对这个数据库操作 但是这种方式只能对结构化数据操作 对于非结构化数据无能为力 采用OLEDB数据访问形式 该方式设计了一个抽象层 由抽象层负责对不同类型的数据提供统一的形式 程序与数据源打交道均经过抽象层 达到了对结构化 非结构化数据均能按统一的方式进行操作 采用ADO数据模型 该模型在OLEDB的基础上又重新设计了访问层 对高级语言编写的程序提供了统一的以 行 为操作目标的数据访问形式 采用ADO NET数据访问模型 该模型重新整合OLEDB和ADO 并在此基础上构造了新的对象模型 该模型既提供了保持连接的数据访问形式 又提供了松耦合的 以DataSet对象为操作目标的数据访问形式 9 1ADO NET简介 ADO NET是在ADO ActiveXDataObjects 基础上发展的新一代数据存取技术 是微软 NET平台下提出的新的数据访问模型 ADO NET增强了对非连接编程模式的支持 并支持RICHXML 由于传送的数据都是XML格式的 因此任何能够读取XML格式的应用程序都可以进行数据处理 ADO NET交互的数据源可以是数据库 也能够是文本文件 Excel表格或者XML文件 ADO NET设计了一系列对各类数据的访问形式 并提供了对应的类 类中提供了与对应数据交互的属性和方法 我们可以通过这些属性和方法对各种数据进行存取操作 ADO NET数据访问模型 VS2008开发环境下使用的是ADO NET2 0 在ADO NET2 0中 数据提供程序 DataProvider 使用统一的数据访问模型对各种数据库进行数据访问 例如Oracle SQLServer DB2 Access等 ADO NET的数据提供程序能将不同类型的数据统一读入到客户机的DataSet缓存中 或者用DataReader对象直接读取数据记录 这样处理后 无论是那种数据源 都可以使用统一的代码访问 ADO NET支持数据库的非连接模式的访问 减少了对数据库的活动连接数目 减低了带宽 提高了存取效率 ADO NET的结构 分为两大部分 数据集 DataSet 数据集是一个非在线 完全由内存表示的一系列数据 可以被看作一份本地磁盘数据库中部分数据的拷贝 数据集完全驻留内存 可以被独立于数据库地访问或者修改 当数据集的修改完成后 更改可以被再次写入数据库 从而保留我们所做过的更改 数据集中的数据可以由任何数据源 DataSource 提供 比如SQLServer或者Oracle 数据提供源 DataProvider 用于提供并维护应用程序与数据库之间的连接 数据提供源是一系列为了提供更有效率的访问而协同工作的组件 DataSet对象是一个用可以XML形式表示的数据视图 是一种数据关系视图 数据库连接方式 一种方式是直接和数据库连接 使用Command对象访问数据库 通过DataReader对象读取数据 这种方式的优点是不用占用本地额外的内存 而是读取数据的速度比较快 另一种方式是将数据缓存DataSet中 使用DataAdapter对象访问数据库 采用这种方式是需要占用额外的内存 并且读取数据的速度相对前一种方式比较慢 NETFramework常见数据提供程序 用于SQLServer的数据提供程序 提供对MicrosoftSQLServer7 0或更高版本中数据的访问 使用System Data SqlClient命名空间 用于OLEDB的数据提供程序 提供对使用OLEDB公开的数据源中数据的访问 使用System Data OleDb命名空间 用于ODBC的数据提供程序 提供对使用ODBC公开的数据源中数据的访问 使用System Data Odbc命名空间 用于Oracle的数据提供程序 适用于Oracle数据源 支持Oracle客户端软件8 1 7和更高版本 并使用System Data OracleClient命名空间 EntityClient提供程序 提供对实体数据模型 EDM 应用程序的数据访问 使用System Data EntityClient命名空间 本教材只讲与SQLServer的连接 9 2数据库与数据库访问工具 9 2 1SQLServer数据库的分类VS2008中有3种与SQLServer数据库的连接形式 分别为 SQLServer SQLServerCompact3 5 和 SQLServer数据库文件 1 MicrosoftSQLServer该选项用于和远程服务器上的数据库连接 2 MicrosoftSQLServer数据库文件该选项用于和SQLServerExpress数据库文件建立连接 3 MicrosoftSQLServerCompact3 5SQLServerCompact3 5是一个更简单的SQLServer数据库版本 数据库扩展名为 sdf 该版本是基于文件的数据库 而不是基于服务的数据库 这种类型的数据库一般用于移动设备应用程序 本地数据库文件 本地数据库文件分类 本地数据库文件 概念 存放在本地机器中的数据库文件本地数据库文件 分类本地数据库 Access MDB文件 SQLServerCompact3 5的sdf文件基于服务的数据库 SQLServer的 mdf文件本地数据库文件属性设置 项目中本地数据库文件的 复制到输出目录 属性的默认值如下 1 对于 sdf文件 其默认值为 如果较新则复制 不变 2 对于 mdf文件 其默认值为 始终复制 改为 如果较新则复制 能够避免数据文件在下次运行时又被旧数据覆盖的问题 9 2 2数据访问可视化工具 1 服务器资源管理器 查看和操作位于数据库服务器上的数据链接 数据库连接和系统资源 库 表 存储过程等 2 数据集设计器 是一套可视化工具 用于创建和编辑类型化数据集和组成数据集的各个项 数据集设计器 提供类型化数据集所包含对象的可视表示形式 可以使用 数据集设计器 创建和修改TableAdapter TableAdapter查询 DataTable DataColumn和DataRelation 3 数据源 数据源 窗口显示项目中的数据源 数据源表示可用于应用程序的数据 可以使用 数据源 窗口在用户界面中创建数据绑定的控件 方法是将各个项从该窗口拖动到项目中的设计 使用流程 本章选用示例数据库 数据库MyDatabase mdf数据表 见P235页定义MyTable1学院编码对照表MyTable2基本情况表MyTable3家庭成员表数据类型说明 char VarcharNchar NvarcharDatetimeImage Binary VarBinaryText NText 9 3ADO NET数据访问对象 ADO NET提供了多种对象模型 这些对象提供了对数据库的各种不同的访问功能 1 Connection对象 2 Command对象 3 DataReader对象 4 DataAdapter对象 5 Parameter对象 6 Transaction对象对于不同的数据库 对象区别仅是前缀不同 例如 SQLServer数据库 SqlConnection SqlDataAdapterOracle数据库 OracleConnection OracleDataAdapter 9 3 1Connection对象 访问数据库的第一步是建立应用程序与数据库的链接ADO NET使用Connection对象与数据库进行连接 Connection对象的常用属性和方法 ConnectionString属性 链接SQL数据库的形式 Database属性 数据库名称Open方法 使用ConnectionString所在指定的属性设置打开的数据库连接Close方法 关闭数据库 这是所有关闭数据库的首选方法 9 3 1Connection对象 连接字符串的常用形式有两种 1 使用Windows集成安全身份验证 例如 stringconnectionString IntegratedSecurity SSPI Database MyDatabase mdf Server localhost 2 使用用户名 密码形式 例如 stringconnectionString server localhost uid sa pwd 123 database MyDatabase mdf 但是这种连接方式的安全性不高 比较容易受到黑客的攻击 9 3 1Connection对象 续 可通过连接字符串直接创建Connection对象 例如 SqlConnectionconn newSqlConnection connString 或者 SqlConnectionconn newSqlConnection conn ConnectionString connString 说明 1 为了简化书写 还需要在代码中添加对命名空间的引用 usingSystem Data SqlClient 2 为了简化代码 一般把ConnectionString定义在app config中 在C 中读取 读取连接字符串StringconnectionString Properties Settings Default MyDatabaseConnectionString 9 3 2Command对象 在ADO NET中 有两种操作数据库的方式 1 采用无连接的方式 2 采用保持连接的方式 不论采用哪种方式 都可以通过SqlCommand对象提供的方法传递对数据库操作的命令 并返回命令执行的结果 9 3 2Command对象 续 在保持连接的方式下操作数据库的一般步骤为 1 创建Connection的实例 2 创建Command的实例 3 打开连接 4 执行命令 5 关闭连接 Command对象 允许对数据库进行操作 建立连接后 可通过该对象对数据库下达命令 增删改等 Command对象的属性及其方法如下 1 ExecuteNonQuery该方法执行SQL语句的结果 但不返回命令执行的表数据 仅返回操作所影响的行数 2 ExecuteReader 返回一个SqlDataReader对象 3 ExecuteScaler 该方法用于执行SELECT查询 得到的返回结果为一个值的情况 比如使用count函数求表中记录个数或者使用sum函数求和等 SQL语句种类 SQL语句种类 DML语句 来操纵数据库 如Select语句 delete语句 update语句 分带参数和不带参数DML语句存储过程 如UpdateRTS3 分带参数和不带参数的存储过程参数处理的方法 SqlParameter对象参数使用方法 声明一个参数 参数不分大小写SqlParameterparameter cmd Parameters Add CategoryName SqlDbType NVarChar 15 为参数赋值parameter Value Beverages 或者 cmd Parameters Add CategoryName SqlDbType NVarChar 15 cmd Parameters CategoryName Value Beverages 或者 用New关键字创建新的参数对象SqlParameterp NewSqlParameter p ParameterName CustomerID p Value ALFKI cmd Parameters Add p 参数方向 Input 参数是输入参数 可省略 Output 参数是输出参数 InputOutput 参数既能输入 也能输出 ReturnValue 参数表示存储过程的返回值 SqlParameterp1 NewSqlParameter SqlParameterp2 NewSqlParameter p1 Direction ParameterDirection Output p2 Direction ParameterDirection Input 存储过程 可以利用SqlCommand对象调用存储过程将SqlCommand对象的CommandText属性设置为存储过程名 将CommandType属性设置为CommandType StoredProcedure 若有参数 向SqlCommand对象的Parameters集合中添加SqlParameters 其中对应的存储过程中的输入输出参数只要正确设置参数的Dirction属性即可 示例 CREATEPROCEDUREAddStudent Namenchar 10 Sexnchar 10 Agesmallint Addressnchar 50 Marriedbit Emailnvarchar 50 ASINSERTINTOClass1 Name Sex Age Address Married Email VALUES Name Sex Age Address Married Email RETURN 使用 SqlConnectionsc newSqlConnection DataSource local IntegratedSecurity SSPI InitialCatalog StudentInf SqlCommandcmd newSqlCommand AddStudent sc cmd CommandType CommandType StoredProcedure SqlParameterparaName newSqlParameter Name SqlDbType NChar 10 paraName Value Name cmd Parameters Add paraName 其他参数 try sc Open cmd ExecuteNonQuery sc Close catch Exceptionex MessageBox Show ex Message 9 3 2SqlCommand对象 续 例9 2 演示SqlCommand对象的用法 9 3 3DataAdapter对象 DataAdapter对象表示一组SQL命令和一个数据库连接 它们用于填充DataSet和更新数据源 DataAdapter对象通过无连接的方式完成数据库和本地DataSet之间的交互 一般步骤 1 创建Connection的实例 2 创建DataAdapter的实例 需要的话 根据select语句生成其他SQL语句 3 创建DataSet的实例 4 使用Fill方法将数据库中的表填充到DataSet表中 5 利用DataGridView或者其他控件对象编辑或显示数据 6 需要的话 使用Update方法更新数据库 9 3 3DataAdapter对象 续 DataAdapter用作DataSet和数据源之间的桥接器以便检索和保存数据 DataAdapter通过映射Fill 这更改了DataSet中的数据以便与数据源中的数据相匹配 和Update 这更改了数据源中的数据以便与DataSet中的数据相匹配 来提供这一桥接器 DataAdapter对象通过SelectCommand InsertCommand UpdateCommand和DeleteCommand属性为后台数据库提供对应的操作命令 并传递需要的参数 一般情况下 只需要提供SELECT语句和连接字符串创建SqlDataAdapter对象 然后利用SqlCommandBuilder对象生成InsertCommand UpdateCommand和DeleteCommand属性 DataAdapter主要方法 Fill方法 Fill DataSet 创建名为Table的数据表 并用数据源返回的行填充它Fill DataTable 用数据源返回的行填充指定的数据表Fill DataSet tableName 用数据源返回的行填充指定的数据集里名为tableName的数据表Fill DataTable DataReader 使用指定的DataReader填充数据表 Update方法 Update DataSet 根据指定DataSet中名为Table的数据表更新数据源Update dataRows 根据指定dataRows数组更新数据源Update DataTable 根据指定DataTale更新数据源Update dataRows DataTableMapping 使用指定的DataTableMapping 根据指定的dataRows数组更新数据源Update DataSet sourceTable 根据DataSet的sourceTable中指定的数据表更新数据源 在ADO NET中 Insert Update Delete命令可以自动生成并暴露给数据适配器 数据适配器要通过命令生成器的构造函数与生成器进行关联 如下所示 SqlCommandcmd newSqlCommand cmd CommandText Selectemployeeid lastnameFromemployees cmd Connection conn adapter SelectCommand cmd SqlCommandBuilderbuilder newSqlCommandBuilder adapter adapter InsertCommand builder GetInsertCommand adapter DeleteCommand builder GetDeleteCommand adapter UpdateCommand builder GetUpdateCommand 9 3 3SqlDataAdapter对象 续 例9 3 根据选择的表名打开数据库表 并将表中数据通过DataGridView显示出来 设计界面如下 9 3 4DataTable对象 ADO NET可以在与数据库断开连接的方式下通过DataSet或DataTable对象进行数据处理 当需要更新数据时才重新与数据源进行连接 并更新数据源 DataTable对象表示保存在本机内存中的表 它提供了对表中行 列数据对象的各种操作 可以直接将数据从数据库填充到DataTable对象中 也可以将DataTable对象添加到现有的DataSet对象中 9 3 4DataTable对象 续 在断开连接的方式下 DataSet对象提供了和关系数据库一样的关系数据模型 代码中可以直接访问DataSet对象中的DataTable对象 也可以添加 删除DataTable对象 9 3 4DataTable对象 续 例9 4 自定义一个DataTable对象 直接创建行列信息 并在DataGridView中显示创建的内容 9 3 5DataSet对象 1 创建DataSet对象使用创建的DataSet对象可以完成各种数据操作 2 填充DataSet对象创建DataSet后 就可以使用SqlDataAdapter对象把数据导入到DataSet对象中 比如通过Fill方法将数据填充到DataSet中的某个表中 1 把数据库中的数据通过DataAdapter对象填充DataSet SqlConnectionsqlConnection1 newSqlConnection DataSource localhost IntegratedSecurity SSPI InitialCatalog Northwind 创建数据连接SqlCommandselectCMD newSqlCommand SELECTCustomerID CompanyNameFROMCustomers sqlConnection1 创建并初始化SqlCommand对象SqlDataAdaptersqlDataAdapter1 newSqlDataAdapter custDA SelectCommand selectCMD sqlConnection Open 创建SqlDataAdapter对象 并根据SelectCommand属性检索数据DataSetdsDataSet1 newDataSet sqlDataAdapter1 Fill dsDataSet1 Customers 使用SqlDataAdapter的Fill方法填充DataSetsqlConnection Close 关闭数据连接 2 通过DataAdapter对象操作DataSet实现更新数据库 以sqlDataAdapter1为参数来初始化SqlCommandBuilder实例SqlCommandBuildersqlCommandBuilder1 newSqlCommandBuilder sqlDataAdapter1 删除DataSet中删除数据表Customers中第一行数据dsDataSet1 Tables Customers Rows 0 Delete 调用Update方法 以DataSet中的数据更新从数据库sqlDataAdapter1 Update dsDataSet1 Customers dsDataSet1 Tables Customers AcceptChanges 方法AcceptChanges能够提交所有正在进行的更改 它使得数据集会将当前值接受为新的原始值 因此 所有挂起的更改都被清除 与RejectChanges一样 也可以对整个数据集 某个表或某个行调用AcceptChanges 一旦批处理更新操作成功完成 您必须调用AcceptChanges来清除挂起的更改 并将当前数据集值标记为原始值 注意 如果省略了最后对AcceptChanges的调用 数据集中则会保留挂起的更改 从而导致在下次进行批处理更新时重新发出这些更改 3 XML和DataSet DataSet中的数据可以从XML数据流或文档创建 并且 NetFramework可以控制加载XML数据流或文档中那些数据以及如何创建DataSet的关系结构 加载XML数据流和文档到DataSet中使用DataSet对象的ReadXml方法 注意 ReadXml来加载非常大的文件 则性能会有所下降 9 4数据绑定技术 数据绑定是指在程序运行时 窗体上的控件自动将其属性和数据源关联在一起 数据绑定技术是数据操作中使用最频繁的技术 利用数据绑定技术能极大地提高项目开发的效率 与数据绑定有关的技术 简单数据绑定与复杂数据绑定 数据源组件 导航控件 9 4 1简单数据绑定与复杂数据绑定 Windows窗体提供了两种类型的数据绑定 简单数据绑定和复杂数据绑定 1 简单数据绑定指将一个控件的某个属性绑定到单个值 这种类型的绑定适用于只显示单个值的控件 一般将这些控件绑定到数据库中某个记录的一个字段 比如TextBox等控件 2 复杂数据绑定指将一个控件绑定到多个值 这种类型的绑定适用于显示多个值的控件 例如DataGridView控件 ListBox控件和ComboBox控件等 9 4 1简单数据绑定与复杂数据绑定 从实现数据绑定的方式上 有3种实现方法 在设计界面下通过鼠标拖放实现常用属性的数据绑定 在设计界面下设置控件的DataBindings属性 然后利用可视化界面实现各种属性的数据绑定 直接编写代码实现数据绑定 实际上 不论采用哪种方式 从本质上来讲 都是利用BindingSource组件来实现数据绑定的 9 4 1简单数据绑定与复杂数据绑定 1 通过鼠标拖放实现数据绑定对于比较简单的数据库应用 大部分情况下 都可以在设计界面下通过鼠标拖放完成绑定功能 常用方式有 将 数据源 中的数据表字段直接拖放到设计窗体上 让系统自动创建和该表字段绑定的控件 将 数据源 中的表直接拖放到设计窗体上 让系统自动创建和该表绑定的控件 将 数据源 中的字段直接拖放到窗体上已有的控件上 该控件即自动绑定到拖放的表字段 9 4 1简单数据绑定与复杂数据绑定 2 通过设置控件的属性实现数据绑定工具箱中提供的每个控件 都有一个 DataBindings 属性 用于绑定数据源 利用它实现数据绑定的步骤如下 1 在窗体中 选择该控件并显示属性窗口 然后展开 DataBindings 属性 此时即看到与控件对应的默认绑定属性 实际上 用鼠标拖放所绑定的属性都是自动绑定到默认的属性 2 单击 Advanced 属性右边的 按钮 显示 格式设置和高级绑定 对话框 再此对话框中 选择要绑定的数据源和被绑定的属性即可 9 4 1简单数据绑定与复杂数据绑定 3 直接编写代码实现数据绑定如果程序员希望灵活地控制绑定的数据库表字段 也可以直接编写绑定代码 采用这种方式实现数据绑定的步骤如下 从 工具箱 中拖放一个BindingSource组件 一个自动生成的强类型的DataSet组件 一个强类型的DataAdapter组件到设计窗体上 如果窗体上已经有这些对象 则不需要此步骤 从 工具箱 中拖放一个被绑定的控件到设计窗体上 修改控件的 Name 属性为有意义的名称 添加绑定代码 9 4 1简单数据绑定与复杂数据绑定 例9 5 演示常用控件的数据绑定方法 9 4 2BindingSource组件 1 BindingSource组件用统一的数据绑定中间层绑定不同数据源 用法 1 将BindingSource组件绑定到实际数据源 2 将控件绑定的数据源设置为BindingSource组件 9 4 2BindingSource组件 续 BindingSource组件常用的属性主要有 1 DataSource属性 获取或设置绑定到BindingSource的数据源 2 Sort属性 获取或设置数据源中各列的排序字符串 3 Filter属性 获取或设置数据源中记录筛选条件字符串 4 Current属性 指绑定列表中的当前项 9 4 2BindingSource组件 续 例9 6 设计一个Windows应用程序 显示本机当前支持的所有字体 左图为设计界面 右图为运行效果 9 4 3BindingNavigator组件 BindingNavigator组件同时提供了两种功能 提供了对窗体中的数据进行导航控制和常用数据操作的方法提供了一个ToolStrip控件形式的导航条 常用属性 1 BindingSource 指定组件所要绑定的BindingSource对象 2 Dock 确定BindingNavigator组件提供的ToolStrip在窗体设计器中的位置 9 4 3BindingNavigator组件 例9 7 设计一个Windows窗体应用程序 自动将MyDatabase mdf中包含的所有表的名称显示出来供用户选择 同时在界面中提供记录导航和添加 删除等功能 并能保存修改后的结果 左图为设计效果 右图为运行效果 9 5DataGridView控件 DataGridView是用于WindowsFroms2 0的新网格控件 通过DataGridView控件 可以显示和编辑表格式的数据 而这些数据可以取自多种不同类型的数据源 DataGridView控件提供了大量的属性 方法和事件 可以用来对该控件的外观和行为进行自定义 1 DataGridView的亮点 9 5DataGridView控件 2 绑定数据源利用DataGridView控件操作数据库中的数据时 一般都是利用数据绑定技术来实现 步骤如下 1 将数据库中的表数据读到DataSet或者DataTable中 2 创建一个BindingSource对象 将BindingSource对象绑定到DataSet或者直接绑定到DataTable 3 将DataGridView绑定到BindingSource对象 privatevoidshowData try OracleConnectionconn newOracleConnection ConnectionString conn Open OracleDataAdapterda newOracleDataAdapter string Format SELECTInventory No CK no CK name Start Time InventoryMans Insert Time OtherFromT BJ InventoryWhereProfitOrLossisnullAndInventory Nolike 0 orderbyInventory No Inventory No Text conn DataSetds newDataSet da Fill ds bindingSource1 DataSource ds Tables 0 this bindingNavigator1 BindingSource bindingSource1 this dataGridView1 DataSource bindingSource1 catch Exceptionex MessageBox Show ex ToString finally conn Dispose conn Close ds Dispose 9 5DataGridView控件 例9 8 演示DataGridView常用功能 设计界面如下 9 6数据处理 9 6 1图像数据处理1 利用SQL语句实现图像导入导出 1 导入图片stringconnString Properties Settings Default MyDatabaseConnectionString stringsql updateMyTable2set照片 Photowhere姓名 StudentName using SqlConnectionconn newSqlConnection connString SqlCommandcmd newSqlCommand sql conn cmd Parameters Add StudentName SqlDbType NVarChar Value 王小琳 OpenFileDialogopenFileDialog1 newOpenFileDialog if openFileDialog1 ShowDialog DialogResult OK StreammyStream openFileDialog1 OpenFile 保存图像到myStreambyte bt newbyte myStream Length 定义字节流数组myStream Read bt 0 int myStream Length 保存图像到字节流数组cmd Parameters Add Photo SqlDbType Image Value bt conn Open cmd ExecuteNonQuery myStream Dispose 9 6 1图像数据处理 2 导出图片stringconnString Properties Settings Default MyDatabaseConnectionString stringsql select照片fromMyTable2where姓名 StudentName using SqlConnectionconn newSqlConnection connString SqlCommandcmd newSqlCommand sql conn cmd Parameters Add StudentName SqlDbType NVarChar Value 王小琳 conn Open SqlDataReaderdr cmd ExecuteReader if dr Read if dr 0 GetType typeof DBNull byte bs byte dr 0 保存dr 0 中的图像到字节流数组bs中MemoryStreamms newMemoryStream bs 定义内存流数组Bitmapimage newBitmap ms 定义BitmapGraphicsg this CreateGraphics g DrawImage image 10 10 显示Bitmapg Dispose ms Dispose 9 6 1图像数据处理 2 利用PictureBox控件实现图像导入导出 例9 12 演示数据库中图像数据的处理方法 设计界面如下 9 6 2关联表数据处理 假如 在数据库StudentDB中 在显示表Student和Score时 希望选中某个学生时 表Score只显示此学生的成绩 两个表的这种关系叫做主从关系 关联表 例9 13 利用DataGridView完成对学生人员基本信息的所有数据编辑操作 包括添加 删除 保存以及对照片和家庭人员情况的处理 同时显示学院编码和编码对应的名称 当用户选择名称时 自动修改对应的编码 设计界面 9 6 2关联表数据处理 自学 运行界面 9 7存储过程 存储过程是指将常用的或复杂的数据库操作 预先用SQL语句写好并用一个指定的名称存储起来 以后需要完成与已定义好的存储过程的功能相同的数据库操作时 只需调用存储过程的名称即可 存储过程具有以下优点 存储过程编辑器事先对存储过程进行了语法检查处理 避免了因SQL语句语法不正确引起运行时出现异常的问题 只在保存存储过程时数据库服务器才进行编译 9 7存储过程 续 在定义或编辑存储过程的时候 可以直接检查运行结果是否正确 提高了开发效率 避免了查询字符串中包含单引号可能会出现的问题 一个项目中可能会多处用到相同的sql语句 使用存储过程便于重用 修改灵活方便 当需要修改完成的功能时 只需要修改定义的存储过程即可 而不必单独修改每一个引用 9 7存储过程 1 创建和修改存储过程在VS2008开发环境下 利用 服务器资源管理器 除了可以直接创建SQLServer数据库和数据库中的表以外 还可以直接创建或修改存储过程 2 在存储过程中定义参数存储过程可以带参数 也可以不带参数 利用SqlCommand对象的Parameters属性提供的功能 可以传递执行存储过程所用的参数 SQLServer的存储过程如果带参数 参数名必须以 为前缀 参数的方向 Input 参数是输入参数 可省略 Output 参数是输出参数 InputOutput 参数既能输入 也能输出 ReturnValue 参数表示存储过程的返回值 9 7存储过程 3 利用SqlDataAdapter或者SqlCommand调用存储过程在程序中利用SqlDataAdapter或者SqlCommand调用存储过程时 和定义存储过程中参数的定义一样 程序中也必须指明参数名 参数类型和参数方向 如果参数方向是输入参数 可以省略参数方向 其他情况均不能省略 参数名不区分大小写 参数类型用SqlDbType枚举表示 4 利用数据集设计器调用存储过程将存储过程变为强类型的对象 这样编译器就可以在编译期间检查所有可能出现的错误 具体实现办法是 将存储过程从 服务器资源管理器 中直接拖放到数据集设计器中 让系统自动生成对应的组件 并自动生成对应的调用方法 9 7存储过程 例9 14 演示存储过程的用法 设计界面 9 8语言集成查询 LINQ 9 8 1LINQ简介LINQ LanguageIntegratedQuery 是一组技术的统称 其主要思想是 它将各种查询功能直接集成到C 语言中 即用C 语法编写查询语句 而不是用针对特定数据库的SQL语法 LINQ是VisualStudio2008中的领军人物 借助于LINQ技术 我们可以使用一种类似SQL的语法来查询任何形式的数据 到目前为止LINQ所支持的数据源有SQLServer XML以及内存中的数据集合 开发人员也可以使用其提供的扩展框架添加更多的数据源 例如MySQL Amazon甚至是GoogleDesktop LINQ的好处 1 无需复杂学习过程即可上手2 编写更少代码即可创建完整应用 3 更快开发错误更少的应用程序 4 无需求助奇怪的编程技巧就可合并数据源 5 让新开发者开发效率更高 9 8语言集成查询 LINQ 学习LINQ的关键主要有两点 查询表达式 用C 3 0开始提供的语法编写 对象关系设计器 O R设计器 其形式有些类似于数据集设计器 所有LINQ查询操作都由以下三部分组成 1 获取数据源 2 定义查询表达式 并将查询表达式保存在某个查询变量中 3 利用查询变量执行查询 9 8 1LINQ简介 显示查询结果的办法主要有 1 调用查询变量的属性或方法获取进一步的结果 2 在foreach语句中 通过遍历查询变量得到所有查询结果 3 用数据绑定显示查询结果 即将BindingSource绑定到查询变量 再将控件绑定到BindingSource 然后在窗体上将结果显示出来 9 8 1LINQ简介 1 查询数组 创建数据源int scores newint 97 92 81 60 定义查询表达式varquery fromscoreinscoreswherescore 80selectscore 执行查询Console WriteLine 显示查询结果 foreach intiinquery Console Write i 9 8 1LINQ简介 2 查询数据库 前提 1 在项目中新建一个名为MyDatabaseClasses dbml的 LINQtoSQL类 文件 2 双击MyDatabaseClasses dbml打开O R设计器 3 从服务器资源管理器中将MyTable1拖到O R设计器中MyDatabaseClassesDataContextcontext newMyDatabaseClassesDataContext 定义查询表达式varquery fromtableincontext MyTable1selecttable 执行查询Console WriteLine 记录数 0 query Count foreach vartinquery Console WriteLine 0 1 t 编码 t 名称 9 8 1LINQ简介 3 查询DataSetMyDatabaseDataSetdataset newMyDatabaseDataSet MyDatabaseDataSetTableAdapters MyTable1TableAdapteradapter newMyDatabaseDataSetTableAdapters MyTable1TableAdapter adapter Fill dataset MyTable1 定义查询表达式varquery fromtableindataset MyTable1selecttable 执行查询foreach vartinquery Console WriteLine 0 1 t 编码 t 名称 9 8 2查询表达式 LINQ查询表达式由一组类似于SQL的声明性语法编写的子句组成 每个子句包含一个或多个表达式 而且表达式又可以包含子表达式 LINQ查询表达式必须以from子句开头 并且必须以select或group子句结尾 在第一个from子句和最后一个select或group子句之间 查询表达式可以包含一个或多个where orderby join let甚至附加的from子句 还可以使用into关键字将join或group子句的结果作为附加查询子句的源数据 9 8 2查询表达式 LINQ表达式的构成 1 from子句from子句用于指定数据源和范围变量 例如查询本章开头列出的表MyTable1 varquery fromtable1incontext MyTable1selecttable1 9 8 2查询表达式 2 where子句where子句用于指定筛选条件 即只返回筛选表达式结果为true的元素 筛选表达式也是用C 语法来构造 例如 varquery1 fromtable1incontext MyTable1wheretable1 编码 01 9 8 2查询表达式 3 orderby子句orderby子句用于对返回的结果进行排序 ascending关键字表示升序 descending关键字表示降序 例如 varquery2 fromtable2incontext MyTable2wheretable2 性别 男 9 8 2查询表达式 4 group子句group子句用于按指定的键分组 group后面可以用by指定分组的键 例如 MyDatabaseClassesDataContextcontext newMyDatabaseClassesDataContext varquery2 fromtable2incontext MyTable2orderbytable2 学号ascending table2 成绩descendingwheretable2 性别 男 9 8 2查询表达式 5 select子句select子句用于生成查询结果并指定每个返回的元素的 形状 或类型 除了前面所举的select子句的用法外 还可以用select子句让范围变量只包含成员的子集 例如查询结果只包含数据表中的一部分字段等 当select子句生成除源元素副本以外的内容时 该操作称为 投影 9 8 2查询表达式 MyDatabaseClassesDataContextcontext newMyDatabaseClassesDataContext varquery2 fromtable2incontext MyTable2selecttable2 成绩 Console WriteLine 平均值 0 最大值 1 query2 Average query2 Max varquery3 fromtable2incontext MyTable2selectnew StudentName table2 姓名 Grade table2 成绩 9 8 2查询表达式 6 join子句join子句用于将来自不同源序列并且在对象模型中没有直接关系的元素相关联 每个join子句只接受两个源序列 如果有多个源 可以用多个join子句 9 8 2查询表达式 三种最常见的联接类型 内部联接 分组联接和左外部联接 1 内部联接内部联接产生一个结果集 对于该结果集内第一个集合中的每个元素 只要在第二个集合中存在一个匹配元素 该元素就会出现一次 如果第一个集合中的某个元素没有匹配元素 则它不会出现在结果集内 join子句所实现的内部联接就是关系数据库所描述的内部联接 内部连接举例 varmyQuery1 fromtable2incontext MyTable2jointable3incontext MyTable3ontable2 学号equalstable3 学号selectnew StudentName table2 姓名 ReleationName table3 成员姓名 Releation table3 与本人关系 9 8 2查询表达式 2 分组联接分组联接会产生一个分层的结果序列 该序列将左侧源序列中的元素与右侧源序列中的一个或多个匹配元素相关联 例如 varmyQuery1 fromtable2incontext MyTable2jointable3incontext MyTable3ontable2 学号equalstable3 学号intorelationselectnew StudentName table2 姓名 Releation relation 9 8 2查询表达式 3 左外部联接左外部联接是这样一个联接 在其中返回第一个集合的每个元素 而无论该元素在第二个集合中是否具有相关元素 可以使用LINQ 通过对分组联接的结果调用DefaultIfEmpty来执行左外部联接 在左外部联接中 返回的是左侧源序列中的所有元素 即使它们在右侧序列中没有匹配的元素也是如此 左外部连接举例 varmyQuery1 fromtable2incontext MyTable2jointable3incontext MyTable3ontable2 学号equalstable3 学号intorelationfromiteminrelation DefaultIfEmpty selectnew StudentName table2 姓名 ReleationName item null item 成员姓名 Releation item null item 与本人关系 9 8 3对象关系设计器 O R设计器 O R设计器提供了一个可视化的图形设计界面 用于创建基于数据库中对象的LINQtoSQL实体类和关联 关系 O R设计器用于在应用程序中创建映射到数据库中对象的对象模型 它还生成一个强类型DataContext 用于在实体类与数据库之间发送和接收数据 O R设计器还提供了相关功能 用于将存储过程和函数映射到DataContext方法以便返回数据和填充实体类 最后 O R设计器提供了设计实体类之间的继承关系的能力 O R设计器 1 O R设计器在Windows窗体应用程序中 打开O R设计器的方法是 1 创建一个Windows窗体应用程序 2 在 解决方案资源管理器 中 鼠标右击项目名 选择 添加 新建项 在弹出的窗口中 选择 LINQtoSQL类 模板 该模板的默认扩展名为 dbml 输入一个合适的名字 例如MyDatabaseClasses dbml 然后单击 添加 按钮 将数据表从 服务器资源管理器 中拖放到O R设计器的实体窗格之后 它就会自动生成类型化的DataContext和实体类 9 8 3对象关系设计器 O R设计器 2 LINQtoSQLLINQtoSQL用于直接查询数据库架构 借助于LINQtoSQL提供的O R设计器 程序员只需要编写少量的代码即可实现数据库的选择 插入 删除 更新以及其他数据库操作 在LINQtoSQL中执行Insert Update和Delete操作的方法是 向对象模型中添加对象 更改和移除对象模型中的对象 LINQtoSQL 1 插入记录MyDatabaseClassesDataContextdb newMyDatabaseClassesDataContext intmax db MyTable1 Count MyTable1t newMyTable1 t 编码 max ToString 00 t 名称 新纪录 max db MyTable1 InsertOnSubmit t db SubmitChanges LINQtoSQL 2 删除记录MyDatabaseClassesDataContextdb newMyDatabaseClassesDataContext varquery1 fromt1indb MyTable1wheret1 编码 07 selectt1 if query1 Count 0 varq1 query1 First db MyTable1 DeleteOnSubmit q1 db SubmitChanges LINQtoSQL 3 修改记录MyDatabaseClassesDataContextdb newMyDatabaseClassesDataContext varquery1 fromt1indb MyTable1wheret1 编码 04 selectt1 if query1 Count 0 varq1 query1 First q1 名称 修改后的纪录 db SubmitChanges Theend
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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


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

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


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