在 VB.NET WinForms 專案中,第一個 MsgBox 用於輸入驗證(當欄位為空時)可正常彈出,但在 Try 區塊執行資料庫更新後,第二個 MsgBox(「Save success」或「Save Fail」)卻不會顯示。即使改用 MessageBox.Show 也無效。
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
If TextBox8.Text = "" Or TextBox9.Text = "" Or MaskedTextBox1.Text = "" Then
MsgBox("Please input above")
End If
Dim mycn As New SqlClient.SqlConnection
Dim mycom As New SqlClient.SqlCommand
mycn.ConnectionString = "Data Source=192.168.0.215;Initial Catalog=blue;uid=sa;pwd=Wks123"
mycom.CommandText = "Update KnitC set Cleaner ='" & MaskedTextBox1.Text & "' where substring(filenm,1,4)='" & TextBox8.Text & "' and substring(filenm,charindex('.',FileNM)+1,LEN(fileNM)-charindex('.',fileNM))='" & TextBox9.Text & "'"
mycom.Connection = mycn
Try
mycn.Open()
Dim mysqlreader As Data.SqlClient.SqlDataReader = mycom.ExecuteReader
If mycom.ExecuteNonQuery > 0 Then
MsgBox("Save success")
Else
MsgBox("Save Fail")
End If
Catch ex As Exception
Finally
mycn.Close()
End Try
End Sub
ExecuteReader 用於返回結果集的查詢(如 SELECT),而 UPDATE 操作應使用 ExecuteNonQuery。代碼先呼叫 ExecuteReader,導致命令已執行完畢,隨後再呼叫 ExecuteNonQuery 時命令狀態可能已改變,返回值不準確。If mycom.ExecuteNonQuery > 0 放在 ExecuteReader 之後,此時命令已無法再次執行更新。Catch 區塊為空,若發生例外將靜默失敗,且 MsgBox 不會被觸發。Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
' 輸入驗證
If String.IsNullOrEmpty(TextBox8.Text) OrElse String.IsNullOrEmpty(TextBox9.Text) OrElse String.IsNullOrEmpty(MaskedTextBox1.Text) Then
MessageBox.Show("Please input above", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Return
End If
Using mycn As New SqlClient.SqlConnection("Data Source=192.168.0.215;Initial Catalog=blue;uid=sa;pwd=Wks123")
Dim sql As String = "UPDATE KnitC SET Cleaner = @Cleaner WHERE SUBSTRING(filenm,1,4)=@Part1 AND SUBSTRING(filenm,CHARINDEX('.',FileNM)+1,LEN(FileNM)-CHARINDEX('.',FileNM))=@Part2"
Using mycom As New SqlClient.SqlCommand(sql, mycn)
mycom.Parameters.AddWithValue("@Cleaner", MaskedTextBox1.Text)
mycom.Parameters.AddWithValue("@Part1", TextBox8.Text)
mycom.Parameters.AddWithValue("@Part2", TextBox9.Text)
Try
mycn.Open()
Dim rowsAffected As Integer = mycom.ExecuteNonQuery()
If rowsAffected > 0 Then
MessageBox.Show("Save success", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
MessageBox.Show("Save Fail - No matching record", "失敗", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
Catch ex As Exception
MessageBox.Show("Database error: " & ex.Message, "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Using
End Using
End Sub
ExecuteNonQuery 執行 UPDATE/INSERT/DELETE。Using 確保連線與命令物件正確釋放。Catch 中顯示錯誤訊息,避免靜默失敗。Return,不繼續執行資料庫操作。MsgBox 不彈出的根本原因是命令執行方式錯誤與異常被吞噬。改用 ExecuteNonQuery 並完善錯誤處理即可解決。