首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

VB.NET MsgBox 在 Try 區塊中不顯示的解決方案

     編輯:程式設計綜合問答

問題描述

在 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

問題分析

  1. 執行方法錯誤:ExecuteReader 用於返回結果集的查詢(如 SELECT),而 UPDATE 操作應使用 ExecuteNonQuery。代碼先呼叫 ExecuteReader,導致命令已執行完畢,隨後再呼叫 ExecuteNonQuery 時命令狀態可能已改變,返回值不準確。
  2. 邏輯判斷位置:If mycom.ExecuteNonQuery > 0 放在 ExecuteReader 之後,此時命令已無法再次執行更新。
  3. 異常處理缺失: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。
  • 採用參數化查詢防止 SQL 注入。
  • 利用 Using 確保連線與命令物件正確釋放。
  • 在 Catch 中顯示錯誤訊息,避免靜默失敗。
  • 驗證失敗時直接 Return,不繼續執行資料庫操作。

總結

MsgBox 不彈出的根本原因是命令執行方式錯誤與異常被吞噬。改用 ExecuteNonQuery 並完善錯誤處理即可解決。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved