2011-09-05 35 views
0

使用參數比較推薦以下哪種兩種方法之一將更新與給定的查詢字符串數據庫的數據庫:更新在.NET

選項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 

或者還有其他更好的方法來做到這一點嗎?

+0

我建議你可以試試[Code Review](http://codereview.stackexchange.com/)。 –

+0

因爲你從來沒有打開過連接,所以沒有一個是做更新的好方法:) – Tim

+0

我只是不想讓代碼變得複雜多了,因爲在這種情況下,sqlConnection對象代表了已經打開的連接。 – rfc1484

回答

1

它看起來像你想創建一個可重複使用的UpdateCommand,這是一個好主意。除了不打開連接,我不確定你是否關閉連接(除非command.Dispose也關閉了連接。你最好將盡可能多的db連接移入Sub中。

而且,我不知道你在哪裏得到ERR從您的異常塊,但我建議設計一個更好的方式來處理任何異常。 - 也許登錄到某個地方

最後,讓子的函數,返回一個布爾值,指出成功/失敗:

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 =無):

Dim params As SqlParameter() 
Dim Updated As Boolean = UpdateDatabase(query, params) 
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 
+0

+1注意防止吞嚥異常。此外,你得到的使用語法大多是正確的 - 我敢肯定,你不需要把Dim放在那裏(我可能是錯的 - 我不寫VB代碼通常)。 – Tim

+0

@Tim謝謝。是的,我認爲這個語法足夠接近以表達關於'Using'結構的觀點。在以前的工作中,有很多VB到VB.NET代碼的遷移,其中包括處理錯誤代碼(通常使用'On Error Resume Next'或'error:'標籤),所以我傾向於不使用相信它。 –

+0

'在錯誤恢復下一個'...我實際上看到了一些VB.NET(1.1)文件中的代碼,大約一年前我必須處理這些文件。想到的第一個想法是「真的嗎?」 – Tim