0

特定のクエリ文字列でデータベースを更新するには、次の 2 つの方法のどちらをお勧めしますか?

オプション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

または、これを行うための他の良い方法はありますか?

4

2 に答える 2

1

再利用可能なUpdateCommandを作成しようとしているようですが、これはすべて問題ありません。接続を開かないことに加えて、接続を閉じているかどうかはわかりません(コマンド.Disposeも接続を閉じない限り。できるだけ多くのdb接続をSubに移動することをお勧めします。

また、どこでエラーが発生しているのかわかりません。例外ブロックからですが、例外を処理するためのより良い方法を設計することをお勧めします-おそらくどこかにログに記録します。

最後に、Subを関数にして、成功/失敗を示すブール値を返します。

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を確認します)。

Dim params As SqlParameter()
Dim Updated As Boolean = UpdateDatabase(query, params)  
于 2011-09-05T08:27:38.743 に答える
1

データベースへのアクセスとは関係のない主な理由の 1 つは、どちらも良いことではありません...

管理されたすべての例外を飲み込んでいます。例外を適切に処理できる場合にのみ、例外を処理してください。例外を取得して戻り値に変換する必要はほとんどありません。これを行う場合、それはもはや例外的な状況ではないと私は考えています。

VB.NET の構文をよく覚えていUsingないので、別の例をまだ提供できません。も使用Callしません。必須ではないと思います。

疑似コードの並べ替え:

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

    command.ExecuteNonQuery() // No need to call dispose, Using does that.
End Using
于 2011-09-05T08:18:57.357 に答える