3

我想知道避免以下情况的最基本方法是什么。

    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
4

3 回答 3

2

您可以尝试创建一个类(单例类),并在该类中编写数据库连接语法代码和异常,然后将一个对象调用到主类以创建数据库连接,这是性能上最好的方法,并且保持编写相同代码不断...

于 2012-10-09T13:58:39.647 回答
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)
于 2012-10-09T14:07:58.053 回答
0

您可以使用 just using block,在处理结束时对非托管对象使用 execute dispose 。

链接: http: //msdn.microsoft.com/en-us/library/htd05whh (v=vs.80).aspx

于 2012-10-09T13:58:53.860 回答