打开/关闭SQL连接 - 冗余代码

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

1
请不要破坏你的问题 - 除非你要关闭它。 - Jonathan Leffler
2
通常情况下,最好在程序运行期间只使用一个与数据库的连接。 - dan1111
我已经发布了解决方案,而且我认为标题足够清晰。如果你想编辑这篇文章,至少也要保留解决方案让其他人可以看到它。 - Meowbits
2
@dan1111 - 你是在建议始终保持与数据库的打开连接吗?如果是这样,在大多数圈子中,这并不被认为是“更好”的做法,因为它会对可扩展性产生负面影响,并且无法利用连接池。 - RQDQ
1
你的最终函数看起来有一些设计问题...你的类比它应该有的要大得多。 - Joel Coehoorn
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
2
这是许多程序员试图创建“数据库层”的地方,其方法签名的变化看起来像这样:
Public DataSet ExecuteSQL(ByVal sql As String) As DataSet

这样可以将所有的样板连接代码隔离在一个地方。输入一个sql命令字符串,输出数据。很容易。

不要这样做!

这个方法走的方向是正确的,但有一个非常大的缺陷:它强制你使用字符串操作将参数值替换到sql查询中。这会导致可怕的sql注入安全漏洞。

相反,确保在您的方法中包含一些机制来单独提示sql参数。这通常以函数的附加参数形式出现,可以简单地作为KeyValuePairs数组。如果您熟悉lambda表达式,我的首选模式看起来像这样:

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

您可以尝试创建一个类(单例类),并在该类中编写数据库连接语法代码和异常,然后调用一个对象到主类以创建数据库连接,这样即可保持最佳性能,并避免重复编写相同的代码...


1
单例模式在这里不是一个好选择。它限制了你对数据库访问的线程数量。我曾犯过那个错误,只有一次。 - Joel Coehoorn
我理解这一点,我认为这不是一个错误,而是在特定项目中使用数据库的选择。 - E_X

0

对我来说有点高级,但我不怀疑它会很有用。我只是想在这里维持生活而已;)非常感谢! - Meowbits
我很高兴能帮助你,Meowbits。你也可以只使用块来完成。 - Aghilas Yakoub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,