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

标签 sql database vb.net

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

    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

最佳答案

这就是许多程序员想要创建一个“数据库层”的地方,方法签名的变体看起来像这样:

Public DataSet ExecuteSQL(ByVal sql As String) As DataSet

这允许您将所有样板连接代码隔离在一个地方。一个sql命令串进去,数据出来。很简单。

不要这样做!

这是朝着正确的方向前进,但有一个很大的缺陷:它迫使您使用字符串操作来将参数值替换到您的 sql 查询中。这会导致可怕的 SQL 注入(inject)安全漏洞。

相反,请确保在您的方法中包含一些机制来分别提示输入 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)

关于sql - 打开/关闭 sql 连接 - 冗余代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12801472/

相关文章:

javascript - 使用 Ajax 控制工具包使用 POST 请求时出现 Ajax 错误

sql - 检查两列相同的长条件

sql - SQL Server 中从字符串转换为 uniqueidentifier 错误时转换失败

mysql - AWS RDS MySQL 性能

java - 查询 Hibernate 缓存而不是数据库

mysql - DataGridView 中的 List(Of T) 过载问题

vb.net - 在 VB.NET 中跟踪所有事件

javascript - Node mssql更新查询,获取行数

MYSQL CSV 列检查排除

database - 关系的候选键的最小数量?