我想知道避免以下情况的最基本方法是什么。
con.ConnectionString = connection_String
con.Open()
cmd.Connection = con
'database interaction here
cmd.Close()
我一直在我的项目中制作这些线条,但我认为必须有更好的方法来节省一遍又一遍地输入。它使代码看起来比现在更加邋!!
结束这一点,对我来说效果很好。谢谢你的帮助:)
Public Sub connectionState()
If con.State = 0 Then
con.ConnectionString = connection_String
con.Open()
cmd.Connection = con
Else
con.Close()
End If
End Sub
答案 0 :(得分:2)
您可以尝试创建一个类(单例类),并在该类中编写数据库连接语法代码和异常,然后将一个对象调用到主类以创建数据库连接,这是性能的最佳方式并保持在...上编写相同的代码...
答案 1 :(得分:2)
这是许多程序员想要创建一个“数据库层”的地方,其中包含方法签名的变体,如下所示:
Public DataSet ExecuteSQL(ByVal sql As String) As DataSet
这允许您在一个地方隔离所有样板连接代码。 sql命令字符串进入,数据出来。容易。
不要这样做!
这是朝着正确的方向前进,但有一个非常大的缺陷:它强制你使用字符串操作将参数值替换为sql查询。这导致了可怕的SQL注入安全漏洞。
相反,请确保在方法中包含一些机制来单独提示sql参数。这通常以函数的附加参数的形式出现,并且可以像KeyValuePairs的数组一样简单。如果你对lambdas感到满意,我的首选模式如下:
Public Iterator Function GetData(Of T)(ByVal sql As String, ByVal addParameters As Action(Of SqlParameterCollection), ByVal translate As Func(Of IDatarecord, T)) As IEnumerable(Of T)
Using cn As New SqlConnection("connection string"), _
cmd As New SqlCommand(sql, cn)
addParameters(cmd.Parameters)
cn.Open()
Using rdr As SqlDataReader = cmd.ExecuteReader()
While rdr.Read()
Yield(translate(rdr))
End While
End Using
End Using
End Function
要调用该函数,您可以执行以下操作:
Dim bigCustomers = GetData("SELECT * FROM Customers WHERE SalesTotal > @MinSalesTotal", _
Sub(p) p.Add("@MinSalesTotal", SqlDbType.Decimal, 1000000), _
MyCustomerClass.FromIDataRecord)
答案 2 :(得分:0)
您可以使用using block
,在处理结束时使用非管理对象上的execute dispose。
链接:http://msdn.microsoft.com/en-us/library/htd05whh(v=vs.80).aspx