UML软件工程组织

用ADO.Net实现通用数据库编程(2)
作者:王凯明 本文选自:赛迪网 2003年03月07日

 



运用数据库命令接口

在我们创建了数据库连接对象的接口引用并完成与数据库的连接之后,我们就可以创建一个数据库命令对象来实现对数据库的实际操作。同样,数据库命令对象包括了OleDbCommand类型的对象和SqlCommand类型的对象。不过在本实例程序中我们还是要将创建的对象传递给一个类型为IDbCommand的接口引用,并在后面的程序中运用之。

接着上面的SQL Server版的实例程序,我们创建了一个SqlCommand类型的对象。

Private Function CreateCommand(ByVal query As String) _
As IDbCommand
Return New SqlCommand(query, sqlConn)
End Function


这样我们就可以将该对象传递给它的接口引用,并在以后的程序中一直使用该接口引用了。下面的函数实现了接口引用的ExcuteNonQuery操作,其返回的结果是该操作实际被影响到的记录的数目。同时它还提供了ExcuteScalar、ExcuteReader和ExcuteXmlReader等不同的操作方法。

Private Sub RemoveAccount(ByVal id As Integer)
Dim query As String = _
"delete from Account where AccountId = " & id
Dim command As IDbCommand = CreateCommand(query)
Dim numrow As Integer = command.ExecuteNonQuery()
Console.WriteLine("{0} rows updated", numrow)
End Sub


运用数据读取器接口

如上面提到的那样,我们在创建一个数据库命令对象后可以通过执行ExcuteReader操作来获取一个类型为IDataReader的接口引用。通过该数据读取器,我们就可以获得一个只读的而且只能向前读的数据流。数据读取器在处理大量记录的时候是非常有效的,因为任何时候它在主存中仅存储了一条当前记录,所以处理的效率是非常高的。在运用完一个数据读取器之后,我们必须显式的将其关闭,否则就得不到任何由它返回的参数或结果。数据读取器拥有一个Item属性,通过该属性我们能访问当前的记录,它还具有一个Read方法,该方法的功能就是向前读取数据,读取成功返回true,否则为false。

下面的函数运用了一个数据读取器的接口引用,并在控制台中显示Account表中的各条记录信息。

Private Sub ShowList()
Dim query As String = "select * from Account"
Dim command As IDbCommand = CreateCommand(query)
Dim reader As IDataReader = command.ExecuteReader()
While reader.Read()
Console.WriteLine("{0} {1,-10} {2:C}", _
reader("AccountId"), reader("Owner"), _
reader("Balance"))
End While
reader.Close()
End Sub


Access版的实例程序

上面我给出了SQL Server版的实例程序的部分代码,下面则是Access版的部分代码(除去了命令循环的部分,该部分内容请参考源代码文件中的源码,其中SQL Server版的文件夹为ConnectedSql,Access版的文件夹为ConnectedJet)。通过比较代码中为粗体的那些部分,我相信你会很容易找到运用接口技术实现通用数据库编程的方法的。

' ConnectedJet.vb
Imports System
Imports System.Data
Imports System.Data.OleDb
Module ConnectedJet
Private connStr As String = _
"Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Data Source=C:\OI\Databases\SimpleBank.mdb"
Private conn As IDbConnection
Dim jetConn As New OleDbConnection()
Sub Main()
OpenJet()
CommandLoop()
End Sub
Private Sub OpenJet()
conn = jetConn
conn.ConnectionString = connStr
Console.WriteLine("Using Access DB SimpleBank.mdb")
Console.WriteLine("Database state: " & _
conn.State.ToString())
conn.Open()
Console.WriteLine("Database state: " & _
conn.State.ToString())
End Sub
Private Sub CommandLoop()
...
Private Sub ShowList()
Dim query As String = "select * from Account"
Dim command As IDbCommand = CreateCommand(query)
Dim reader As IDataReader = command.ExecuteReader()
While reader.Read()
Console.WriteLine("{0} {1,-10} {2:C}", _
reader("AccountId"), reader("Owner"), _
reader("Balance"))
End While
reader.Close()
End Sub
Private Sub AddAccount(ByVal bal As Decimal, _
ByVal owner As String, ByVal id As Integer)
Dim query As String = "insert into Account values(" _
& id & ", '" & owner & "', ' ', " & bal & ")"
Dim command As IDbCommand = CreateCommand(query)
Dim numrow As Integer = command.ExecuteNonQuery()
Console.WriteLine("{0} rows updated", numrow)
End Sub
Private Sub RemoveAccount(ByVal id As Integer)
Dim query As String = _
"delete from Account where AccountId = " & id
Dim command As IDbCommand = CreateCommand(query)
Dim numrow As Integer = command.ExecuteNonQuery()
Console.WriteLine("{0} rows updated", numrow)
End Sub
Private Sub ChangeAccount(ByVal id As Integer, _
ByVal owner As String)
Dim query As String = _
"update Account set Owner = '" _
& owner & "' where AccountId = " & id
Dim command As IDbCommand = CreateCommand(query)
Dim numrow As Integer = command.ExecuteNonQuery()
Console.WriteLine("{0} rows updated", numrow)
End Sub
Private Sub ClearAccounts()
Dim query As String = "delete from Account"
Dim command As IDbCommand = CreateCommand(query)
Dim numrow As Integer = command.ExecuteNonQuery()
Console.WriteLine("{0} rows updated", numrow)
End Sub
Private Function CreateCommand(ByVal query As String) _
As IDbCommand
Return New OleDbCommand(query, jetConn)
End Function
End Module

非连接模式下的实现方法


1.运用数据集对象

一个数据集对象能以XML的形式将数据存放在主存中,对于任何类型的数据源,它都提供了一个统一的编程模型,这就大大减轻了编程人员的工作。一个数据集对象中包含了一系列的表以及表之间的关系。而每个表中又包含了其主键、外键、字段和约束等信息,这些综合起来就决定了表的模式,表中还包含了一系列存储表数据的记录。

你可以运用以下一些方法产生一个数据集对象:

a. 运用一个数据适配器对象从一个数据库中读取模式和数据并产生数据集对象。

b. 动态创建模式并生成数据集对象。

c. 从XML数据源中获取数据集对象。

用上面的第二种和第三种方法获取的数据集对象本身就是数据库无关的,而在运用第一种方法时,我们可以通过使用类型为IDbDataAdapter的接口引用来达到通用数据库编程的目的。

2.运用数据适配器接口

数据适配器在数据集对象和其数据源之间起了一个桥梁的作用。ADO.Net中同样有两种类型的数据适配器对象,一种为OleDb类型的,另一种为SqlServer类型的。前者的相应类为OleDbDataAdapter,而后者的相应类自然为SqlDataAdapter了。一个数据适配器包括了SelectCommand、InsertCommand、UpdateCommand以及DeleteCommand等属性,通过从这些属性的名称我们不难知道其具体的作用。同时,一个数据适配器还包括了Fill和Update等方法。其中Fill方法能将模式和数据填充到数据集对象中,而Update方法则完成了数据更新的功能。

下面的函数就显示了如何根据一个类型为IDbDataAdapter的接口引用产生一个数据集对象的方法。

Private Sub FillDataSet()
OpenDb()
Dim query As String = "select * from Account"
adapter = CreateAdapter(query)
adapter.Fill(ds)
CloseDb()
End Sub
Private Function CreateAdapter(ByVal query As String) As IDbDataAdapter
Dim adapter As New SqlDataAdapter(query, connStr)
...
Return adapter
End Function


同样,我们的实例程序包括了两个版本,你可以在源代码文件中找到,其中SQL Server版的文件夹为BankDbSql,Access版的文件夹为BankDbJet。


总结


以上我向大家介绍了在ADO.Net中如何运用接口技术实现通用数据库编程的方法,这项技术是非常有用的,而平常我们却很容易将其忽视掉,这样的结果就是应用程序的可升级性、灵活性和通用性大打折扣。所以希望大家能好好掌握这项技术,在实际运用中编写出通用性很强的应用程序,以满足更多的实际需要。

源代码文件为Source.rar[下载源码]

(责任编辑 Sunny)




版权所有:UML软件工程组织