2012-10-25 15 views
0

好的,我正在構建一個VB.NET系統,但是在我的代碼的某些部分捕獲SQL異常時遇到了麻煩。簡而言之,我使用SELECT sql查詢來檢索特定的記錄,並且我想確定MSAccess數據庫中是否存在記錄,以便我不檢索0行。在打印到TextField期間,0行將導致異常。下面是一個示例代碼我工作:如何捕捉VB.NET 2010代碼中的SQL異常?

If txSearch.Text = "" Then 
     MsgBox("Please type the user id or use the barcode reader to scan",  MsgBoxStyle.OkOnly, "Search Field Empty") 
    End If 

    'ElseIf txSearch.Text != "" Then 
    If txSearch.Text <> "" Then 
     Dim con As New OleDb.OleDbConnection 
     Dim dbProvider As String 
     Dim dbSource As String 
     Dim ds As New DataSet 
     Dim dt As New DataSet 
     Dim da As OleDb.OleDbDataAdapter 
     Dim de As OleDb.OleDbDataAdapter 
     Dim sql As String 
     Dim sql1 As String 
     Dim temp_num As Integer 
     Dim cmd As New OleDb.OleDbCommand 

     dbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;" 
     dbSource = "Data Source = new.mdb" 

     con.ConnectionString = dbProvider & dbSource 

     con.Open() 

     Dim search As String 
     search = txSearch.Text 
     MessageBox.Show("You are going to search for " + search + ". Click OK to continue.") 

     sql = "SELECT * FROM Student_Details WHERE Admin_No = '" & txSearch.Text & "'" 

     sql1 = "SELECT * FROM Laptop_Details WHERE Admin_No = '" & txSearch.Text & "'" 

     da = New OleDb.OleDbDataAdapter(sql, con) 

     de = New OleDb.OleDbDataAdapter(sql1, con) 

     'Dim check As Integer = sql. 
     'If check > 0 Then 

     'da.SelectCommand = cmd 
     ds = New DataSet("Student_Details") 
     da.Fill(ds, "Student_Details") 
     dt = New DataSet("Laptop_Details") 
     de.Fill(dt, "Laptop_Details") 
     'con.Close() 

     'If sql <> "" And sql1 <> "" Then 
     'If ds.Equals(1) And ds.Equals(1) Then 
     txAdminNO.Text = ds.Tables("Student_Details").Rows(0).Item(0) 
     txName.Text = ds.Tables("Student_Details").Rows(0).Item(1) 
     txProgramme.Text = ds.Tables("Student_Details").Rows(0).Item(2) 
     cmbSStatus.SelectedText = ds.Tables("Student_Details").Rows(0).Item(3) 
     txSerial.Text = dt.Tables("Laptop_Details").Rows(0).Item(1) 
     txModel.Text = dt.Tables("Laptop_Details").Rows(0).Item(2) 

     Dim com As New OleDb.OleDbCommand(sql, con) 
     Dim com1 As New OleDb.OleDbCommand(sql1, con) 

     Try 

      temp_num = com.ExecuteNonQuery 
      temp_num = com1.ExecuteNonQuery 

     Catch ex As IndexOutOfRangeException 
      Trace.WriteLine(ex.ToString) 

     End Try 

     con.Close() 
     'End If 
     'End If 
    End If 
+0

你爲什麼不抓住他們? –

+1

你在想'如果ds.Tables(0).Rows.Count ...'? – Fionnuala

回答

0

嘗試是這樣的:

if ds.Tables("Student_Details").Rows.Count > 0 
    txAdminNO.Text = ds.Tables("Student_Details").Rows(0).Item(0) 
    txName.Text = ds.Tables("Student_Details").Rows(0).Item(1) 
    txProgramme.Text = ds.Tables("Student_Details").Rows(0).Item(2) 
    cmbSStatus.SelectedText = ds.Tables("Student_Details").Rows(0).Item(3) 

End if 

if ds.Tables("Laptop_Details").Rows.Count > 0 
    txSerial.Text = dt.Tables("Laptop_Details").Rows(0).Item(1) 
    txModel.Text = dt.Tables("Laptop_Details").Rows(0).Item(2) 
End if 

爲了幫助您與您的意見我會做這樣的:

if ds.Tables("Student_Details").Rows.Count > 0 And ds.Tables("Laptop_Details").Rows.Count > 0 
    txAdminNO.Text = ds.Tables("Student_Details").Rows(0).Item(0) 
    txName.Text = ds.Tables("Student_Details").Rows(0).Item(1) 
    txProgramme.Text = ds.Tables("Student_Details").Rows(0).Item(2) 
    cmbSStatus.SelectedText = ds.Tables("Student_Details").Rows(0).Item(3) 
    txSerial.Text = dt.Tables("Laptop_Details").Rows(0).Item(1) 
    txModel.Text = dt.Tables("Laptop_Details").Rows(0).Item(2) 
else 
    MsgBox("The user with id "+txSearch.Text+" does not exist") 
end if 
+0

Thanx HaBouF,我會嘗試你的建議。 – marlaw21

+0

它工作。謝謝你們的幫助。 – marlaw21

+0

如果我的回答對您有幫助,請將我的回答標記爲已接受。謝謝 – Nianios

0

儘量使用try-catch語句:

嘗試
        你這裏的代碼爲您的查詢語句。
抓住EX爲例外
        MSGBOX(ex.Message)
結束Try

+0

@Remou,我實際上是這樣想的:if ds.Tables(0).Rows.Count ...但我嘗試了各種形式的If End If來確定查詢是否返回任何行而沒有成功。請給我一個方法。 – marlaw21

+0

我在代碼的最後使用了它,但它不起作用。我甚至試圖捕獲一個SQL異常,但系統崩潰了。我想要做的就是通知用戶如果記錄不存在:MsgBox(「ID爲」+ txSearch.Text +「的用戶不存在」) – marlaw21