DBHelper2对ado.net的优化与扩展
一、优化ADO.NET的操作
ADO.NET中访问数据比较烦人的几个步骤:
1、创建connection对象,此时需要用到数据库连接串。通常数据库连接串是在web.config文件中配置的,需要通过configurationManager从配置文件中获取。
2、从connection上创建command对象,传入SQL语句。
3、如果SQL语句有参数,需要依次创建parameter对象,并传入各参数值。
4、通过connection打开数据库连接。
5、通过command的ExecuteNonQuery, ExecuteReader, ExecuteScalar方法读取数据或执行SQL命令,或通过DataAdapter对象执行Fill操作等。
6、关闭数据库连接。
以上繁烦的操作在DBHelper中得到了优化:
1、可以直接使用在web.config中配置好的数据库连接串名字来创建DBHelper实例。
2、不需要再使用command对象来操作。
3、可以在一条语句中一次性传入SQL语句、参数名和参数值。
4、直接执行ExecuteXXXX或ReadTable等,不需要显式操作打开或关闭数据库。
5、使用约定值可减少代码量。比如创建DBHelper对象时可以省略连接串名称,此时使用约定的数据库连接串名称”ConnectionString”。
二、示例
1、ExecuteScalar
Dim ProductID As Integer = 1
'使用DBFactory创建DBHelper实例
'指定数据库连接串,根据连接串的providerName来确定数据库类型,默认为SQLSERVER
Using db As DBHelper = DBFactory.CreateDBHelper("ConnectionString")
Dim SQL As String = "select Name from Production.Product where ProductID=@ProductID"
'执行ExecuteScalar,需要SQL,参数名数组,参数值数组
Dim Name As Object = db.ExecuteScalar(SQL, {"@ProductID"}, {ProductID})
appendText(String.Format("Product Name:{0}", Name))
End Using
2、ExecuteReader
Dim ProductID As Integer = 1
'创建DBHelper实例时不指定连接串,默认使用name="ConnectionString"的连接串
Using db As DBHelper = DBFactory.CreateDBHelper
Dim SQL As String = "select * from Production.Product where ProductID=@ProductID"
'执行ExecuteReader,需SQL,参数名数组,参数值数组
Dim dr As DbDataReader = db.ExecuteReader(SQL, {"@ProductID"}, {ProductID})
If dr.Read Then
appendText(String.Format("Product Name:{0}", dr("Name")))
Else
appendText("Product not found")
End If
End Using
3、ExecuteNonQuery
'创建DBHelper实例
Using db As DBHelper = DBFactory.CreateDBHelper
Dim Result AsInteger
Try
Dim sqlInsert As String = "Insert into dbo.ErrorLog (UserName,ErrorNumber,ErrorMessage) values (@UserName,@ErrorNumber,@ErrorMessage)"
Result = 0
For errorNumber As Integer = 9990 To 9999
'执行ExecuteNonQuery,需SQL,参数名数组,参数值数组,返回受影响的记录数
Result += db.ExecuteNonQuery(sqlInsert, {"@UserName", "@ErrorNumber", "@ErrorMessage"}, {"TestUser", errorNumber, "测试数据。" & errorNumber})
Next
appendText(String.Format("Insert Result: {0}.", Result))
Catch ex As Exception
appendText("Insert Error: " & ex.Message)
End Try
Try
Dim sqlUpdate As String = "update dbo.ErrorLog set ErrorMessage=@ErrorMessage where ErrorNumber=@ErrorNumber"
Result = db.ExecuteNonQuery(sqlUpdate, {"@ErrorMessage", "@ErrorNumber"}, {"更新后的测试数据。", 9999})
appendText(String.Format("Update Result: {0}.", Result))
Catch ex As Exception
appendText("Update Error: " & ex.Message)
End Try
Try
Dim sqlDelete As String = "delete from dbo.ErrorLog where ErrorNumber=@ErrorNumber"
Result = db.ExecuteNonQuery(sqlDelete, {"@ErrorNumber"}, {9990})
appendText(String.Format("Delete Result: {0}.", Result))
Catch ex As Exception
appendText("Delete Error: " & ex.Message)
End Try
End Using
4、使用ReadTable方法取代Fill方法,风格与ExecuteXXX保持一致
'创建DBHelper实例
Using db As DBHelper = DBFactory.CreateDBHelper
'将SQL的查询结果直接转换为数据表
Dim t As DataTable = db.ReadTable("select top 10 * from person.person")
If t IsNot Nothing AndAlso t.Rows.Count > 0 Then
For Each r As DataRowIn t.Rows
appendText(r)
Next
Else
appendText("Table is empty.")
End If
End Using