详解C#下数据库编程

开发 后端
本文将介绍C#下数据库编程,笔者试着用C#结合ADO.NET研发了一些项目。现借这个机会,和读者们一起分享C#研发数据库的快乐。

C#下数据库编程前言:

曾几何时,OO语言大家族中又多了一位新成员,他有个坚强、锐利而又不失好听的名字,C#(读做C Sharp)。C#由Microsoft一手打造,更重要的是其总设计师就是Turbo Pascal、Delphi的缔造者、天才的Anders。记得在一次C#的演示会上,Anders和Microsoft的主管人员曾立下壮志,要让C#取代VC++,成为今后.NET研发的最佳选择语言。但后来的许多负面的议论也不免让人对这个C#表示怀疑,有人说C#就是Java的翻版,几乎没有什么自己的特点,更有人说C#效率低下,而且和VB.NET有非常大类同,根本就没有意义推出,不久就会下台并最终死亡,等等。我们也不禁怀疑起来,C#真的这么命短?真的会和Java没有什么大的交锋就英年早逝?

两年多过去了,这种议论大部分已随着事实不攻自破。C#不仅没有死亡,而且有着超乎寻常的生命力,正在用他锋利的语言利剑,让世人真正领教了什么叫做系出名门、天生立志。在.NET平台研发上,C#已成为无可争议的最佳选择语言,更令人吃惊的是,这个人称和Java雷同的"仿制品"语言却不知道为什么,一步步在蚕食Java的地盘,令Java的缔造者已开始感到不安,更让Java的使用者或多或少有些动摇。

大约1年前,我接触到了C#,并且试着以我一贯审视IT界发展的眼光去审视他。通过一些日子的学习和体会,我确实感觉这个语言的不平凡性,特别是他充分利用了.NET的优势和特点,并有VS.NET的完美集成于.NET研发平台中。在我长年研发的数据库领域,我试着用C#结合ADO.NET研发了一些项目。现借这个机会,和读者们一起分享C#研发数据库的快乐。

C#下数据库编程正文:

如果你以前用过Visual Foxpro研发数据库项目,你就会有这种体会,VFP对数据库的操作,还是一种对数据库文件的操作,比如:

  1. OPEN DATABASE MyDatabase &&打开数据库MyDatabase  
  2. USE MyTable &&打开数据库中的MyTable表  
  3. GO 5 &&将Cursor跳到第5条记录  
  4. REPLACE MyName WITH "杨扬" &&用"杨扬"替换第5条记录上的MyName字段  
  5. GO BOTTOM &&将Cursor跳到最后一条记录  
  6. LOCATE FOR MyName=="杨扬" &&查找并定位  
  7. IF FOUND()  
  8. "FOUND!" 
  9. ELSE 
  10. "NOT FOUND!" 
  11. ENDIF  
  12. USE &&关闭MyTable  
  13. CLOSE DATABASE MyDatabase &&关闭数据库MyDatabase 

这段小程式能说是VFP中比较简单的一段小程式了,但非常有代表性。从这段程式我们能感觉到,在VFP想操纵一个数据库中的一个表需要许多类似文件的操作,比如:打开数据库、打开表、跳转Cursor、读取字段内容、查找字段内容、关闭表、关闭数据库等等。这些操作虽然直观易懂,但十分不方便使用,而且如果同时有多个表打开,经常会出现表的轮换访问的问题,就需要不断的转换表的工作区,十分的麻烦和容易出错。最关键的是,这种操作方法不符合OO思想的精华--封装。

如果你熟悉OO编程思想,或原来有OO设计经验,你可能会和我相同这样想,如果一个数据库就是个对象,所有的操作、信息都通过方法(Method)、属性(Attribure)、事件(Event)提供出来,供研发者使用,那该多好啊。C#正是借助基于这种思想设计的数据库访问技术ADO.NET,并提供了一系列方便实用的类。应用这些数据库访问的类,你就能轻松、准确而且是面向对象的操纵数据库中的各种数据了。

如图,这就是C#中提供的数据库访问ADO.NET的结构图。 

C#中提供的数据库访问ADO.NET的结构图

从这张图中,我们能清晰的了解到ADO.NET的数据访问技术的架构。ADO.NET支持SQL Server数据访问和OLE DB数据访问。两者相比,前者是针对SQL Server的数据库访问引擎,所以访问SQL Server数据库效率会高许多,但只支持SQL Server。后者是比较通用的数据库访问引擎,能支持广泛的数据库,但效率不如前者。对研发者来说,如果不用到某种数据库的特性,其大体使用方法是一致的。

上述内容指数据库的连接部分,也就是上图中的Connetion对象。Connection对象提供了和具体数据库的连接方式,具体你是用SqlConnection对象还是OleDbConnection对象,这个根据你的数据库类型由你选择而定,下面的叙述中,为了不占用过多的篇幅,在无特别内容的地方,不再分开叙述。

下面给出两段典型的数据库连接的例子。在此之前,请在程式头部using处添加using System.Data.SqlClient或System.Data.OleDb,以确保数据库访问时用到的命名空间能引用 

  1. SQL Server数据访问  
  2. string strConn="Integrated Security=SSPI;Initial Catalog=MyDatabase;Data Source=YY-POWERPC ";  
  3. SqlConnection myConnection = new SqlConnection (strConn);  
  4. myConnection.Open();  
  5. OleDb数据访问  
  6. String strConn="Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=MyDatabase;Integrated Security=SSPI";  
  7. OleDbConnection myConnection=new OleDbConnection (strConn);  
  8. myConnection.Open(); 

上述步骤执行后,如果没有异常抛出,便可成功完成和数据库的连接。在完成了和数据库的连接后,接下来就是建立一个DataAdapter对象,来完成可访问数据库的工作。DataAdapter的工作是后面DataSet的基础,其内容就是建立一个DataSet和数据库的中间层,来协调访问。由于DataAdapter和DataSet的关系十分紧密,我就结合在一起介绍了。DataAdapter也分为SqlDataAdapter和OleDbDataAdatper两种。下面给出一段典型代码(OleDbDataAdapter的情况可类推):

  1. SqlDataAdapter myDataAdapter = new SqlDataAdapter ();  
  2. DataSet myDataSet = new DataSet ();  
  3. string strCom = "SELECT * FROM 会员信息表";  
  4. myDataAdapter.SelectCommand = new SqlCommand (strCom,myConnection);  
  5. SqlCommandBuilder myCB = new SqlCommandBuilder (myDataAdapter);  
  6. myDataAdapter.Fill (myDataSet,"会员信息表"); 

这段代码用到了SqlDataAdapter、DataSet、SqlCommand、SqlCommandBuilder四个对象。从上图中能看出,SqlDataAdapter的作用就是负责和数据库的通讯访问,同时和DataSet相连,他的内部有四个非常重要的Command对象(同样分为SqlCommand和OleDbCommand),都是访问数据库必用的,分别为SelectCommand、InsertCommand、UpdateCommand、DeleteCommand对象。这些Command对象便是专门用来完成对数据库的查询、插入、更新、删除操作,他们就像四个大臣,在DataAdapter的控制下分别主管各自的事情。其中SelectCommand是他们四个中的老大,由他能自动的构造生成另外的三个。构造生成的过程就是应用CommandBuilder。在这之前,我们只需要指定DataAdapter中的SelectCommand对象,就能了。

在设置好了SQL Select语句后,就能开始填充相应的数据集了。方法是应用DataAdapter的Fill方法,参数为DataSet及其中的某个DataTable。这里要着重讲一讲DataSet对象。如果你用过ADO中的Recordset对象,你可能会感觉到DataSet和Recordset的差别。Recordset一般只能应用于单表,即一个Recordset对应于一张表。而DataSet中有一个DataTableCollection,即一个DataTable集合,能包含多个DataTable对象。DataTable对象看上去就更加像一张表了,其中有DataRowCollection、DataColumnCollection、ConstraintCollection。他们分别代表DataRow(数据行)、DataColumn(数据列)、Constraint(约束关系)的对象集合。可能说这么多,你已有点儿迷糊了,先看一句代码吧。

  1. myDataSet.Tables["MyTable"].Rows[3]["MyName"] = "杨扬"

怎么样?是不是一下子就明白了许多。这是一句多么完美的OO思想表达出的语句啊!这句就是将DataSet下的一个名为MyTable的"虚表"中的第4行的MyName字段的内容改为"杨扬"。为什么叫"虚表"呢?这是因为ADO.NET的一个特点就是脱机连接数据库。这样能减少网络通讯的压力,提高效率。你可能会问DataColumn在哪呢?Rows[3]就表示了第4行记录,换句话说Rows[3]就是个DataRow对象,一加上["MyName"]就自动定位到了MyName字段的内容。ADO.NET规定,访问表中内容必须是先行后列的原则,Column["MyName"][3]是不允许的。当然,DataColumn也是什么重要的,比如想查看某列的列头(Field),能用Column[1].ColumnName更改。

好了,目前我觉得你应该大体上明白C#下数据库编程是怎么一回事了吧,其实这里只是讲了一小部分,因为ADO.NET数据库访问技术包含的内容太多了,不是一两遍文章就能说清的。更有许多许多有用的操作,比如添加、修改、删除、更新、查询等等都还没有介绍。

【编辑推荐】

  1. 浅析C#正则表达式
  2. 实现DB2功能的C#数据库编程实例
  3. C#语言操纵数据库事务
  4. 概述C#语言异常处理
  5. 简单介绍C#数组和函数
责任编辑:彭凡 来源: sudu.cn
相关推荐

2009-08-07 16:19:00

C#下数据库编程

2009-08-25 16:36:16

C#进行数据库编程

2009-08-07 15:38:15

精通C#数据库编程

2010-09-13 09:03:49

Access数据库

2024-04-03 00:06:03

2010-05-14 09:08:10

C#Oracle

2009-08-07 15:33:11

C#数据库编程

2024-04-18 09:56:16

2024-03-04 18:49:59

反射C#开发

2009-08-25 17:13:57

C#串口编程

2009-08-11 13:35:13

C# Berkeley

2009-03-19 10:08:09

C#数据库查询

2009-08-07 15:26:38

C#数据库编程实例

2010-10-26 15:21:11

连接Oracle数据库

2009-08-24 18:09:13

C#调用Oracle数

2009-08-17 17:42:57

C#数据库操作类

2009-07-31 17:01:21

C#存取Access数

2009-08-06 18:10:06

C#数据库事务

2009-09-04 17:23:21

C#数据库连接对象

2009-08-25 14:05:06

C#连接数据库代码
点赞
收藏

51CTO技术栈公众号