SqlException 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
當 SQL Server 傳回警告或錯誤時,所擲回的例外狀況。 此類別無法獲得繼承。
public ref class SqlException sealed : System::Data::Common::DbException
[System.Serializable]
public sealed class SqlException : System.Data.Common.DbException
public sealed class SqlException : System.Data.Common.DbException
[<System.Serializable>]
type SqlException = class
inherit DbException
type SqlException = class
inherit DbException
Public NotInheritable Class SqlException
Inherits DbException
- 繼承
-
SqlException
- 屬性
範例
下列範例會產生 SqlException ,然後顯示例外狀況。
using Microsoft.Data.SqlClient;
using System.Text;
class Program
{
static void Main()
{
string s = GetConnectionString();
ShowSqlException(s);
Console.ReadLine();
}
public static void ShowSqlException(string connectionString)
{
string queryString = "EXECUTE NonExistantStoredProcedure";
StringBuilder errorMessages = new StringBuilder();
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand(queryString, connection);
try
{
command.Connection.Open();
command.ExecuteNonQuery();
}
catch (SqlException ex)
{
for (int i = 0; i < ex.Errors.Count; i++)
{
errorMessages.Append("Index #" + i + "\n" +
"Message: " + ex.Errors[i].Message + "\n" +
"LineNumber: " + ex.Errors[i].LineNumber + "\n" +
"Source: " + ex.Errors[i].Source + "\n" +
"Procedure: " + ex.Errors[i].Procedure + "\n");
}
Console.WriteLine(errorMessages.ToString());
}
}
}
static private string GetConnectionString()
{
// To avoid storing the connection string in your code,
// you can retrieve it from a configuration file.
return "Data Source=(local);Initial Catalog=AdventureWorks;"
+ "Integrated Security=SSPI";
}
}
備註
每當 .NET Framework Data Provider for SQL Server 遇到從伺服器產生的錯誤時,就會建立這個類別。 (客戶端錯誤會擲回為標準 Common Language Runtime exceptions.) SqlException 一律包含至少一個 實例 SqlError。
嚴重性層級為 10 或更少的訊息為資訊,並指出使用者輸入之資訊中錯誤所造成的問題。 從 11 到 16 的嚴重性層級是由用戶產生,而且可由使用者更正。 17 到 25 的嚴重性層級表示軟體或硬體錯誤。 當發生層級 17、18 或 19 錯誤時,您可以繼續運作,雖然您可能無法執行特定的語句。
當嚴重性層級為 19 或低於 19 時,SqlConnection 仍保持開啟。 當嚴重性層級為 20 或以上時,伺服器通常會關閉 SqlConnection。 但是,使用者可以再次開啟連線,然後繼續進行。 在這兩個情況中,SqlException 皆由執行該命令的方法所產生。
如需 SQL Server 所傳送之警告和參考訊息的相關信息,請參閱 Database Engine 事件和錯誤。 類別SqlException會對應至 SQL Server 嚴重性。
以下是處理例外狀況的一般資訊。 您的程式代碼應該攔截例外狀況,以防止應用程式當機,並允許向使用者顯示相關的錯誤訊息。 您可以使用資料庫交易來確保不論用戶端應用程式中發生什麼情況 (包括當機) ,數據都一致。 System.Transaction.TransactionScope 或 BeginTransaction 方法等功能 (System.Data.OleDb.OleDbConnection、System.Data.ODBC.ODBCConnection 和 Microsoft.Data.SqlClient.SqlConnection) 不論提供者引發的例外狀況為何,都能確保一致的數據。 交易可能會失敗,因此攔截失敗並重試交易。
請注意,從 .NET Framework 4.5 開始,SqlException可以傳回內部 Win32Exception。
.NET Framework 資料提供者的例外狀況類別會報告提供者特定的錯誤。 例如,System.Data.Odbc 有 OdbcException、System.Data.OleDb 有 OleDbException,而 Microsoft.Data.SqlClient 有 SqlException。 如需錯誤詳細數據的最佳層級,請攔截這些例外狀況,並使用這些例外狀況類別的成員來取得錯誤的詳細數據。
除了提供者特定的錯誤之外,.NET Framework 數據類型可以引發 .NET Framework 例外狀況,例如 System.OutOfMemoryException 和 System.Threading.ThreadAbortException。 可能無法從這些例外狀況復原。
不正確的輸入可能會導致 .NET Framework 數據提供者類型引發例外狀況,例如 System.ArgumentException 或 System.IndexOutOfRangeException。 在錯誤的時間呼叫方法可能會引發 System.InvalidOperationException。
因此,一般而言,撰寫例外狀況處理程式,以攔截任何提供者特定的例外狀況,以及 Common Language Runtime 的例外狀況。 這些可以分層,如下所示:
try {
// code here
}
catch (SqlException odbcEx) {
// Handle more specific SqlException exception here.
}
catch (Exception ex) {
// Handle generic ones here.
}
或:
try {
// code here
}
catch (Exception ex) {
if (ex is SqlException) {
// Handle more specific SqlException exception here.
}
else {
// Handle generic ones here.
}
}
.NET Framework 資料提供者方法呼叫也可能在線程集區線程上失敗,且堆疊上沒有任何用戶程序代碼。 在此情況下,在使用異步方法呼叫時,您必須註冊 UnhandledException 事件來處理這些例外狀況,並避免應用程式當機。
屬性
BatchCommand |
取得 BatchCommand 實例,如果例外狀況不是從批次引發,則會產生錯誤或 Null。 |
Class |
取得從 .NET Framework Data Provider for SQL Server 傳回的錯誤之嚴重性層級。 |
ClientConnectionId |
表示用戶端連接 ID。 如需詳細資訊,請參閱 ADO.NET 中的資料追蹤。 |
Errors |
取得一個或多個 SqlError 物件的集合,這些物件可提供有關 .NET Framework Data Provider for SQL Server 產生的例外狀況之詳細資訊。 |
LineNumber |
取得 Transact-SQL 命令批次內的行號或產生錯誤的預存程序 (Stored Procedure)。 |
Number |
取得識別錯誤類型的值。 |
Procedure |
取得產生錯誤之預存程序或遠端程序呼叫 (RPC) 的名稱。 |
Server |
取得執行 SQL Server 之執行個體 (會產生錯誤) 的電腦名稱。 |
Source |
取得產生錯誤之提供者的名稱。 |
State |
從 SQL Server 取得表示錯誤、警告或「找不到資料」訊息的數值錯誤碼。 如需有關如何將這些值解碼的詳細資訊,請參閱資料庫引擎事件與錯誤。 |
方法
GetObjectData(SerializationInfo, StreamingContext) |
已淘汰.
使用例外狀況的相關資訊來設定 SerializationInfo。 |
ToString() |
傳回字串,代表目前的SqlException物件,並包含用戶端連線識別碼 (如需詳細資訊,請參閱ClientConnectionId)。 |