日期:2009-03-02  浏览次数:20538 次

访问数据库是大多数应用程序的一部分,而且随着C#和ADO.NET的发布,这个过程已经变得相当的简单.本文将展示下面四个基本的数据库操作:

1.读数据.这包括诸如整数,字符串和日期等不同的数据类型.
2.写数据.就象读数据一样我们会写这些通常的数据类型.这是通过SQL语句来实现的.
3.更新或是修改数据.我们还是使用简单SQL语句.
4.删除数据.使用SQL.


这些操作是对一个微软Access 2000数据库进行的,但是SQL或是其它ADO数据源可以通过简单的改变连接字符串来使用.

开始第一步
为了使用ADO类,我们需要包括进ADO.NET命名空间(namespace)和一些精巧的日期类.在你要进行数据库操作的地方加入下列几行代码.它应该被放置在命名空间引入代码行的下面而在类定义的上面.

using System.Data; // 申明变量
using System.Data.ADO; // 数据库
using System.Globalization; // 日期

根据你所参与的工程的类型,你可能需要增加对System.Data命名空间的引用.你可以根据在你添加上面的代码以后编译器是否产生错误来判断.要添加System.Data命名空间,你可以:
1.在Solution explorer-References 分支中右键单击.
2.选择"添加引用"
3.选择.NET Framework标签.
4.双击System.data.dll条目
5.单击OK
6.System.Data现在应该出现在了Solution explorer的引用列表中了.

因为连接字符串在大多数操作中都要使用,所以我建议你将它设置成你要编写的类的成员.注意:在你的程序中,数据库文件的路径有可能不同.

//属性
public const string DB_CONN_STRING =
"Driver={Microsoft Access Driver (*.mdb)}; "+
"DBQ=D:\\CS\\TestDbReadWrite\\SimpleTest.mdb";


读数据
现在一切都变得有趣起来.读数据可以通过ADODataReader类来实现.(参看Chris Maunder的文章"ADO.NET ADODataReader类"来获取关于这个类的更多信息.)读数据的步骤如下:

1.我们用ADOConnection来打开一个数据库.
ADOConnection conn =
new ADOConnection(DB_CONN_STRING);
conn.Open();
2.我们编写一个SQL语句来定义将要取出的数据.这个数据执行的结果是返回一个ADODataReader 对象.注意Execute方法中的out关键字.这在C#中意味着通过引用传递参数.

ADODataReader dr;
ADOCommand cmd =
new ADOCommand( "SELECT * FROM Person", conn );
cmd.Execute( out dr);

3.我们循环遍历ADODataReader中的每一个记录直到我们完成要做的工作.注意:数据被直接作为一个字符串返回同时数据域名称用来指明读的数据域.
while( dr.Read() )
{
System.Console.WriteLine( dr["FirstName"] );
}
4.我们收工
但是,作为好的程序员我们还需要加进许多try/catch/finally语句来确保我们处理了所有的错误.
try
{
.... 数据库操作 ...
}
catch( Exception ex )
{
System.Console.WriteLine( "READING:" );
System.Console.WriteLine( " ERROR:" + ex.Message );
System.Console.WriteLine( " SQL :" + sSqlCmd );
System.Console.WriteLine( " Conn.:" + DB_CONN_STRING );
}
finally
{
// 关闭连接
if( conn.State == DBObjectState.Open )
conn.Close();
}


读取不同的数据类型
dr["stuff"]这个语句通常能够返回一个数据.但是要返回一个int或者DateTime对象的话通常需要进行数据转换.这通常可以通过使用ADODataReader许多内建转换器中的一个来实现.也就是:

int nOrdinalAge = dr.GetOrdinal( "Age" );
int nAge = dr.GetInt32( nOrdinalAge );

DateTime tUpdated = (DateTime)dr["Updated"];

注意GetOrdinal定位数据域用名字来读取数据的用法.如果数据域是空白的(还没有填入任何数据),上面的代码会抛出一个异常.要捕捉这种情况,我们可以用IsNull方法检查是否有数据存在,如下所示:

int nOrdinalAge = dr.GetOrdinal( "Age" );
if( dr.IsNull( nOrdinalAge ) )
{
System.Console.WriteLine( " Age : Not given!" );
}
else
{
int nAge = dr.GetInt32( nOrdinalAge );
System.Console.WriteLine( " Age : " + nAge );
}


插入,修改,删除和其他SQL命令
插入,修改,删除过程可以非常容易的通过SQL语句来实现.下面的代码执行一条SQL命令来插入一条记录.

// SQL 命令
String sSQLCommand =
"INSERT INTO Person (Age, FirstName, Description, Updated) " +
"VALUES( 55, 'Bob', 'Is a Penguin', '2001/12/25 20:30:15' );";
// 创建command对象
ADOCommand cmdAdder = new ADOCommand(
sSQLCommand,
DB_CONN_STRING);
cmdAdder.ActiveConnection.Open();
// Execute the SQL command
int nNoAdded = cmdAdder.ExecuteNonQuery();
System.Console.WriteLine(
"\nRow(s) Added = " + nNoAdded + "\n" );

注意:try/catch代码没有在上面的例子里出现,但是应该包括上面的代码.

插入
上面的代码通过建立一个SQL命令然后执行它来插入一条记录.一些在编写SQL命令时应注意的事项如下:
1.数值数据应该直接表示.没有单引号(').
2.字符串的表示应该包括在单引号中('blah').
3.确保字符串中不包含任何嵌入的单(双)引号.这会使事情混淆.
4.日期和时间数据用包裹