C#与数据库访问技术总结(十八)
ADO.NET 代码综合示例
前面已经介绍过OLE DB.NET和SQL Server.NET数据提供者可以用来连接不同的数据源。
以下代码不仅综合演示了使用ADO.NET的这两种数据提供者访问数据库的一般步骤,而且说明了使用不同种类的ADO.NET组件集合访问数据库的一般步骤。
可以通过代码进一步了解这两种数据提供者访问方式的异同之处。
使用OLE DB.NET Provider
OLE DB的数据提供者可以访问Access和SQL等数据库,代码如下:
//设置连接字符串
string dbname=@" user.mdb";
string db=Server.MapPath(dbPath);
string connectionString ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +db;
//设置SQL语句
string strSQL=" select UserId, UserName from User";
//根据连接字符串,创建连接对象
OleDbConnection conn=new OleDbConnection(connectionString);
//根据连接对象和SQL语句,创建DataAdapter对象
OleDbDataAdapter da=new OleDbDataAdapter(strSQL, conn);
//创建OleDbCommandBuilder, 用来对DataAdapter更好地操作
OleDbCommandBuilder cb=new OleDbCommandBuilder(da);
上述代码演示了从根据连接字符串建立连接对象,到创建DataAdpate对象填充DataSet,再到使用DataSet对象提交数据更新以及与DataGrid绑定的一般过程。
上述代码也演示了使用Connection、DataAdapter和DataSet访问数据库的一般流程。
ADO.NET采用离线的方式访问数据库,所以使用DataSet从数据库获得数据后的操作数据的过程中,不必保持与数据库的连接,直到向数据库提交更新数据时,才需连上数据库。这种做法适合于海量数据更新的情况。
而在上述代码里,因为数据操作过程比较简单,所以直到数据更新提交结束才断开连接,也就是说,并没有采用“离线”的数据库连接访问方式。
不采用“离线”方式的理由是:在数据库访问操作中,频繁连接和断开数据源也需要耗费一定的系统资源,如果这个代价要比保持短时间的数据连接所需的代价大,那么宁可选择“一直在线”的连接方式。
使用SQL Server .NET Provider
以下的代码演示了如何使用SQLServer的.NETProvider来连接和访问数据。
//连接字符串
string connectionString="server=local;database=Northwind;user=sa;pwd=;";
//建立连接
Sqlconnection =new SqlConnection(connectionString);
//SQL语句
string strSql= "select UserID, UserName from User";
//根据连接对象和SQL语句创建SqlCommand对象
SqlCommand cmd=new SqlCommand(strSql, conn);
conn.Open();
//使用Command对象创建SqlDataReader对象
SqlDataReader reader=cmd.ExecuteReader();
//使用DataReader对象填充DataGrid 控件
DataGrid_User.DataSource=reader;
DataGrid_User.DataBind();
//关闭连接
conn.Close();
上述代码也演示了使用Connection、Command和DataReader对象访问数据库的一般方式。
数据库访问综述
前面讲述了用两种不同的数据提供者(Provider)访问连接数据库的方式,如果数据源是SQL Server,则使用SQL Server的Provider;如果数据源是ODBC或是其他类型的数据库,则可以选用OLE DB的Provider。
前面还讲述了使用Connection+Command+DataReader对象和使用Connection+ DataAdapter+DataSet对象的数据库访问方式。
根据DataReader的特性,以Connection+Command+DataReader方式访问数据库的使用场景有:
- 访问数据只用于显示,而不修改。
- 仅对一个数据源进行操作,或是对单表进行操作。
- 对于数据只希望向后顺序访问,而不进行重复遍历。
- 访问数据量小,不需要在内存中大量存储数据。
- 需要访问的结果集太大,不能一次性地全部放入内存,此时也能使用DataReader来逐次访问。
而DataSet支持离线的访问方式,可以有以下的应用:
- 同一业务逻辑需要访问多个数据源,比如同时要向SQL Server和Oracle数据库中请求数据。
- 由于DataSet可以包含多个DataTable,如果需要访问的数据对象来自多个表,可用DataSet的Table来分别存储管理。
- 如果访问操作的数据量比较大,利用DataSet的离线访问机制可以减轻对数据库负载的压力。
DataGrid控件与数据库访问技术
在实际的应用项目中,通常需要把用ADO.NET组件获得的数据信息显示在界面上,供用户浏览或修改。
可以通过使用.NET的DataGrid控件实现这种功能。
DataGrid控件与数据绑定
DataGrid控件的主要目的是实现“数据绑定”(Data Binding),即把DataGrid控件上显示的数据同后台数据库的数据绑定在一起,同步地一起变化。
另外,DataGrid控件以表格的形式显示了查询到的数据结果集,默认的访问方式是只读而不能修改,通过设置,可以实现记录的修改和删除功能。
DataGrid代码示例
通过以下的步骤,能将数据库里的数据动态绑定到DataGrid对象里并显示。
(1)在D盘下建立一个Access类型的数据库,命名为Student.mdb。在其中新建一张Studentlnfo的表,其中的字段如表所示。
字 段 |
中文描述 |
数据类型 |
备 注 |
SID |
学号 |
文本 |
主键 |
SName |
姓名 |
文本 |
一 |
Sex |
性别 |
文本 |
一 |
注意:本书表中“一”表示无须设置相关信息。
完成后往其中插入一些记录,如(001,Tom,Male)。
(2)打开Visual Studio环境后,选择“文件”|“新建”|“新建网站”命令,在弹出的新建网站”对话框中选择“ASP.NET项目”,输入网站名testDataGrid和路径CAroot~DataGrid,登录模块所有代码和配置文件均放在此项目下。
(3)在集成开发环境中的“解决方案资源管理器”里,选中项目,右击,在弹出的快捷菜单中选择“添加新项”命令,新建一个Web配置文件,命名为Web.config。该配置文件主要用来管理登录模块的一些全局性数据。
其中,在配置文件里设置数据库的连接属性,使用OleDB的Data Provider,连接到Access数据源上,代码如下。
<configuration>
<appSettings>
<add key="connStr" value="Porvider=Microsoft.Jet.OleDB.4.0; Data Source=D:\login.mdb "></add>
</appSettings>
<connectionStrings />
(4)在集成开发环境中的“解决方案资源管理器”里,选中项目,右击,在弹出的快捷菜单中选择“添加新项”命令,新建一个Web窗体,命名为showDataGrid.aspx。
(5)打开“工具箱”的“Web窗体”,从中拖曳一个DataGrid控件到页面上,从DataGrid的属性栏中,可以看到该DataGrid对象叫DataGrid1。
选中DataGridView控件,右击,在弹出的快捷菜单中选择"属性"命令,在属性栏的Columns中单击“…”按钮,在弹出的“编辑列”对话框中,通过“添加”命令,依次向DataGridView控件里添加“学号”、“姓名”和“性别”3列,并把每列的DataPropertyName设置成该列对应的数据库字段,用于数据绑定。具体设置如表所示。
数据列名 |
DataPropertyName |
学号 |
SID |
姓名 |
SName |
性别 |
Sex |
(6)双击窗体的空白处,进入相应的逻辑代码文件showDataGrid.aspx.cs。
在该文件的顶端,添加数据库访问引用的命名空间语句:
using System.Data.SqlClient;
并在class的开头添加连接数据库的字符串定义:
Private static string strConnect =System.Configuration.ConfigurationManager.AppSettings["connstr"];
由于使用的是DataProvider,所以ADO.NET组件的对象都以OleDb开头。
上述代码的主要业务逻辑是:
(1)根据连接字符串,创建数据库连接对象,并根据连接对象创建OLeDbCommand对象。
(2)根据SQL语句,查询所有学生的信息,以SID的/顷序排列。
(3)使用OleDbDataApapter对象,将查询结果填充到DataSet中的。均Dataset数据表里。
(4)将DataGrid的数据源设置成。均Dataset数据表,实现数据绑定。
这样,当打开此页面时,DataGrid就能与Access数据库绑定,显示数据库里的学生信息。
C#与数据库访问技术总结(十八)的更多相关文章
- C#与数据库访问技术总结(八)之ExecuteNonQuery方法
ExecuteNonQuery方法 ExecuteNonQuery方法主要用来更新数据. 通常使用它来执行Update.Insert和Delete语句. 该方法返回值意义如下: 对于Update.In ...
- C#-数据库访问技术 ado.net——创建 数据库连接类 与 数据库操作方法 以及简单的数据的添加、删除、修改、查看
数据库访问技术 ado.net 将数据库中的数据,提取到内存中,展示给用户看还可以将内存中的数据写入数据库中去 并不是唯一的数据库访问技术,但是它是最底层的数据库访问技术 1.创建数据库,并设置主外键 ...
- c# 窗体开发4 数据库访问技术
ADO.NET的名称起源于ADO(ACTIVEX DATA OBJECTS) USING SYSTEM; USING SYSTEM.COLLECTIONS.GENERIC; USING SYSTEM. ...
- 数据库访问技术 odbc dao rdo uda jet oledb
一.UDA(UniversalDataAccess) 这是微软提供的通用数据访问策略.包括ADO.OLEDB和ODBC.它不光提供了数据库的访 问能力,对于其它的数据存储技术也同样支持,如目录服务.E ...
- C#与数据库访问技术总结(七)综合示例
综合示例 说明:前面介绍了那么多,光说不练假把式,还是做个实例吧. 表:首先你要准备一张表,这个自己准备吧.我们以学生表为例. 1.ExecuteScalar方法 ExecuteScalar方法执行返 ...
- C#与数据库访问技术总结(十六)之 DataSet对象
DataSet对象 DataSet对象可以用来存储从数据库查询到的数据结果,由于它在获得数据或更新数据后立即与数据库断开,所以程序员能用此高效地访问和操作数据库. 并且,由于DataSet对象具有离线 ...
- C#与数据库访问技术总结(十五)之 DataAdapter对象代码示例
DataAdapter对象代码示例 下面的代码将说明如何利用DataAdapter对象填充DataSet对象. private static string strConnect=" data ...
- C#与数据库访问技术总结(十四)之DataAdapter对象
DataAdapter对象 DataAdapter对象主要用来承接Connection和DataSet对象. DataSet对象只关心访问操作数据,而不关心自身包含的数据信息来自哪个Connectio ...
- C#与数据库访问技术总结(十二)数据阅读器(DataReader)2
遍历数据阅读器中的记录 当ExecuteReader方法返回DataReader对象时,当前光标的位置在第一条记录的前面. 必须调用阅读器的Read方法把光标移动到第一条记录,然后,第一条记录将变成当 ...
随机推荐
- VC++ CTreeCtrl 使用NM_CLICK和TVN_SELCHANGED
//这是当CTREECTRL控件点击时NM_CLICK的处理函数 void CDriverSelCtrl::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult) { C ...
- PHP调试总结
PHP调试总结一,环境方面,比如查看安装扩展是否生效,是总支持某扩展.可以在web目录中建一个phpinfo.php在里面输入<?phpphpinfo();?>在浏览器上访问一下,会输出P ...
- HDU 5410 CRB and His Birthday(完全背包变形)
CRB and His Birthday Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- Java NIO教程 前言
阅读本文前,建议你先了解 旧I/O NIO 是 New I/O 的缩写,要了解它真正的内涵,需要掌握的知识还是比较多的.我努力在这几篇笔记里,勾勒出整个io的面貌.为大家的深入学习铺路. I/O简史 ...
- VS2013中,RDLC设置数据源和参数的界面
今天打开RDLC文件设置参数和数据源时,始终找不到那个窗口,原来那个窗口叫“报表数据”,在“视图”菜单的最下面! 另外:要在当前窗口时打开的RDLC文件时,视图下面才有该选项!!! 参考:http:/ ...
- 新一代IDE Light Table开源:让编程工作更简单
近日,Light Table项目创始人Chris Granger在其博客上宣布Light Table开源,将代码全部托管在GitHub上,遵循GNU开源许可.与此同时,还发布了0.6版本,该版本添加了 ...
- 重签名问题:does not have a signature matching
今天在家里电脑重签名过的apk拿到公司来用装到模拟器上,运行Robotium测试用例时,报了如下错误,原本以为是工程里的activity名称和包名写错了呢,检查了一遍发现木有错误呀.... 好吧,那我 ...
- Java集合之TreeMap
Map的单元是对键值对的处理,之前分析过的两种Map,HashMap和LinkedHashMap都是用哈希值去寻找我们想要的键值对,优点是由O(1)的查找速度. 那如果我们在一个对查找性能要求不那么高 ...
- redis pipeline
redis pipeline 简而言之就是把多个redis命令打包,一起发送给redis server,并且一起返回结果,减少客户端和服务器之间的多次“折返跑”
- nginx 报错 upstream timed out (110: Connection timed out)解决方案
nginx 作PHP的web接口服务器. 在线上发现时不时经常崩溃.504,导致接口访问无响应回复. 查看日志: [error] 11618#0: *324911 upstream timed out ...