使用.net中的参数更新数据库

使用.net中的参数更新数据库,.net,database,vb.net,sqlparameter,.net,Database,Vb.net,Sqlparameter,使用给定查询字符串更新数据库时,建议使用以下哪种方法: 备选案文1: Dim query As String = "INSERT INTO employee VALUES (@Name, @Age)" Dim command As New SqlClient.SqlCommand(query, sqlConnection) Dim params As SqlParameter() = { New SqlParameter("@Name", txtName.Value), New

使用给定查询字符串更新数据库时,建议使用以下哪种方法:

备选案文1:

Dim query As String = "INSERT INTO employee VALUES (@Name, @Age)"
Dim command As New SqlClient.SqlCommand(query, sqlConnection)

Dim params As SqlParameter() = {
    New SqlParameter("@Name", txtName.Value),
    New SqlParameter("@Age", txtAge.Value))
}

Call UpdateDatabase(command, params, NumError, DescError)

Public Sub UpdateDatabase(ByVal command As SqlCommand, ByVal parameters() As SqlParameter, ByRef NumError As Double, ByRef DescError As String)
Try
    For Each parameter In parameters
        command.Parameters.Add(parameter)
    Next
    command.ExecuteNonQuery()
    command.Dispose()
    NumError = 0
    DescError = ""
    Catch ex As Exception
        NumError = Err.Number
        DescError = Err.Description
    End Try
End Sub
备选案文2:

Dim query As String = "INSERT INTO employee VALUES (@Name, @Age)"
Dim command As New SqlClient.SqlCommand(query, sqlConnection)

command.Parameters.AddWithValue("@Name", txtName.Value)
command.Parameters.AddWithValue("@Age", txtAge.Value)

Call UpdateDatabase(command, NumError, DescError)

Public Sub UpdateDatabase(ByVal command As SqlCommand, ByRef NumError As Double, ByRef DescError As String)
    Try
        command.ExecuteNonQuery()
        command.Dispose()
        NumError = 0
        DescError = ""
    Catch ex As Exception
        NumError = Err.Number
        DescError = Err.Description
    End Try
End Sub

或者还有其他更好的方法吗?

这两种方法都没有任何好处,主要原因与数据库访问无关

您正在接受任何和所有托管异常。只有在能够适当处理异常的情况下才能处理异常,几乎不需要接受异常并将其转换为返回值。在我看来,如果你这样做,这不再是一个例外情况

我不太记得VB.NET
使用的
语法,因此我还不能提供另一个示例。我也不会使用
调用
,我认为这不是必需的

一种伪代码:

Using Dim command As New SqlCommand("INSERT...", conn)
    command.Parameters.AddWithValue()
    ....

    command.ExecuteNonQuery() // No need to call dispose, Using does that.
End Using

看起来您正在尝试创建一个可重用的UpdateCommand,这一切都很好。除了不打开连接之外,我不确定您是否正在关闭连接(除非命令.Dispose也关闭了连接)。您最好将尽可能多的db连接移到Sub中

另外,我不确定您在异常块中的错误是从哪里来的,但我建议您设计一种更好的方法来处理任何异常——也许将其记录在某个地方

最后,使子函数成为函数并返回一个bool,指示成功/失败:

Public Function UpdateDatabase(ByVal sql As String, ByVal parameters() As SqlParameter) As Boolean

    Dim Successful As Boolean = False

    Try
        Using conn As SqlConnection = new SqlConnection(sqlConnection)
            Using command As New SqlCommand(sql, conn)

                command.CommandType = CommandType.Text        

                For Each parameter As SqlParameter In parameters
                    command.Parameters.Add(parameter)
                Next

                conn.Open()

                command.ExecuteNonQuery()
                Successful = True
            End Using       
        End Using        
    Catch ex As Exception
        Successful = False
        ' Do something with the exception
    End Try

End Function
然后您可以这样做:

Dim query As String = "INSERT INTO employee VALUES (@Name, @Age)"

Dim params As SqlParameter() = {
    New SqlParameter("@Name", txtName.Value),
    New SqlParameter("@Age", txtAge.Value))
}

Dim Updated As Boolean = UpdateDatabase(query, params)
本例假设
sqlConnection
是一个类级变量,用于保存连接字符串。如果需要,也可以直接从配置文件中读取

如果命令没有任何参数,则需要传入一个空数组(或修改函数中的代码以检查params=Nothing):


我建议你试试。因为你从来没有打开连接,这两种方法都不是进行更新的好方法:)我只是不想让代码复杂化,在那里放了太多不必要的东西,在这种情况下,sqlConnection对象表示已经打开的连接。+1是为了防止吞咽异常。此外,您的使用语法基本正确-我非常确定您不需要在其中添加Dim(我可能错了-我通常不编写VB代码)。@Tim谢谢。是的,我认为语法非常接近,足以说明使用构造的
。在以前的一份工作中,有很多迁移到VB.NET的代码以处理错误代码为特色(通常在错误恢复下一步时使用
错误:
标签),因此我倾向于不相信它。
在错误恢复下一步时使用
我实际上在一些VB.NET(1.1)中看到了这些代码大约一年前我必须处理的文件。第一个想到的是“真的吗?”
Dim params As SqlParameter()
Dim Updated As Boolean = UpdateDatabase(query, params)