[ADO.NET] 如何使用 ADO.NET 的 例外處理 / Exception

[ADO.NET] 如何使用 ADO.NET 的 例外處理 / Exception

1.ADO.NET提供了相關的例外 DbException 類別 供開發者使用,建議在寫相關資料庫的時候可以把它擺上去,補捉到的錯誤訊息會比較詳細。

2.繼承 DbException 類別 的有以下。

System.Data.Odbc.OdbcException
System.Data.OleDb.OleDbException
System.Data.OracleClient.OracleException
System.Data.SqlClient.SqlException

3.記得要將 DbException 擺在 Exception 之前

Try
'實作內容
Catch dbex As OleDbException
'例外捕捉
Catch ex As Exception
'例外捕捉
End Try
  
    Try
Using cn As New OleDbConnection(cs)
Dim qs As String = "SELECT * FROM Employees;"
If cn.State = ConnectionState.Closed Then
cn.Open()
End If
Using cmd As New OleDbCommand(qs, cn)
Using dr As OleDbDataReader = cmd.ExecuteReader()
Dim dt As New DataTable()
dt.Load(dr)
Me.DataGridView1.DataSource = dt
End Using
End Using
End Using
Catch dbex As OleDbException
Console.WriteLine(OleExInfo(dbex))
MessageBox.Show(OleExInfo(dbex), "例外發生", MessageBoxButtons.OK, MessageBoxIcon.Error)
Catch ex As Exception
MessageBox.Show(OleExInfo(ex), "例外發生", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
Private Function OleExInfo(ByVal ex As OleDbException) As String
Dim ErrInfo As String = ""
For i As Integer = 0 To ex.Errors.Count - 1
ErrInfo = "索引: " & i.ToString
ErrInfo &= ControlChars.NewLine
ErrInfo &= "錯誤說明: " & ex.Errors(i).Message
ErrInfo &= ControlChars.NewLine
ErrInfo &= "資料庫錯誤: " & ex.Errors(i).NativeError
ErrInfo &= ControlChars.NewLine
ErrInfo &= "提供者名稱: " & ex.Errors(i).Source
ErrInfo &= ControlChars.NewLine
ErrInfo &= "錯誤代碼:" & ex.Errors(i).SQLState
ErrInfo &= ControlChars.NewLine
Next i
Return ErrInfo
End Function
Private Function SysExInfo(ByVal ex As Exception) As String
Dim ErrInfo As String = ""
ErrInfo = "Source : " & ex.Source
ErrInfo &= ControlChars.NewLine
ErrInfo &= "Data : " & ex.Data.ToString
ErrInfo &= ControlChars.NewLine
ErrInfo &= "Exception Message : " & ex.Message
Console.WriteLine("Database Exception" & ErrInfo)
Return ErrInfo
End Function
  
快照-200971711448 

 

 

5.在MSDN下找不到這兩個類別相關的資訊,所以我認為這兩個類別是獨立不同的,但我試著用 System.Exception 類別丟到 OLEDbException 類別程式卻可以執行,反之亦可;可見這兩個類別有繼承相同的東西。知道的人可以告知一下小弟嗎

Catch dbex As OleDbException
MessageBox.Show(SysExInfo(dbex), "例外發生", MessageBoxButtons.OK, MessageBoxIcon.Error)
Catch ex As Exception
MessageBox.Show(OleExInfo(ex), "例外發生", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try

6.原來
將 滑鼠游標停在 OleDbException 類別,按f12就可以知道彼此的繼承關係了
vb直接按f12,就會出現"物件瀏覽器",如下圖

 

 

c#比較麻煩一點

要先對OleDbException按一次F12,再對DbException再按一次F12(如下圖)

下圖就能看到彼此的關係

6.範例下載:

VB_DBException.rar
CS_DBException.rar

 

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo