我正在尋找將從C#SQL連接檢查連通性的虛擬SQL語句。用於檢查連接性的SQL語句?
基本上我需要發送一個請求到數據庫,我不在乎它返回什麼我只是希望它是成功的,如果數據庫仍然存在,並拋出一個異常,如果數據庫不是。
我正在測試的場景是與數據庫的連接丟失,其中SQLConnections狀態屬性似乎仍然是「打開」但沒有連接。
我正在尋找將從C#SQL連接檢查連通性的虛擬SQL語句。用於檢查連接性的SQL語句?
基本上我需要發送一個請求到數據庫,我不在乎它返回什麼我只是希望它是成功的,如果數據庫仍然存在,並拋出一個異常,如果數據庫不是。
我正在測試的場景是與數據庫的連接丟失,其中SQLConnections狀態屬性似乎仍然是「打開」但沒有連接。
大多數SQL數據庫都有一個用於此目的的「表」。
在DB2中,它是:
select * from sysibm.sysdummy1
而甲骨文,從內存,
select * from dual
它會在後臺取決於數據庫。
你可以這樣做:
Select 1
好了,如何發送一個空字符串或空白。這些是Sql Server的有效命令。
如果由於數據庫不可用而無法打開新連接,則應該會出現錯誤。
這聽起來像你一直保持連接打開(這通常是一個壞主意 - 一個新的連接應該在批次執行之前打開)。是這樣嗎?
是a批次開始時打開一個新連接,但該批次可能需要15分鐘以上。 – 2008-11-04 13:28:52
好的...那麼是什麼?幾分鐘後該批次中止嗎?您的連接超時設置足夠高嗎? (默認爲2分鐘 – StingyJack 2008-11-04 14:20:58
連接丟失可能隨時發生。
如果建議的SELECT語句執行正常,但連接在執行後成功執行,會怎樣?
select getdate()
最簡單的方法是執行不執行任何操作的select。
SELECT N'Test'
最好是爲執行的每個sql語句捕獲實現的未連接異常,而不是使用僞語句來測試連接性。我已經看到系統花費了超過10%的數據庫CPU時間來響應這些虛擬查詢。
例子Delphi代碼,我相信會很容易適應:
function IsConnValid(var Conn: TADOConnection; DBType: TDBType): boolean;
var
qry : TADOQuery;
begin
//gimme a connection, and i'll create a query, try to retrieve dummy data.
//if retrieval works, return TRUE. otherwise, return FALSE.
qry := TADOQuery.Create(nil);
try
qry.Connection := Conn;
case DBType of
//syntax for a dummy query varies by vendor.
dbOracle : qry.Sql.Add('SELECT 1 FROM DUAL');
dbSqlServer : qry.Sql.Add('SELECT 1');
end; //case
try
qry.Open;
//try to open the query.
//if we lost the connection, we'll probably get an exception.
Result := not(qry.Eof); //a working connection will NOT have EOF.
qry.Close;
except on e : exception do
//if exception when we try to open the qry, then connection went bye-bye.
Result := False;
end; //try-except
finally
qry.Free;
end; //try-finally
end;
一個發現如果與數據庫的連接仍然實際存在的方式,就是儘量在連接上執行一些操作。如果連接已經死亡,ConnectionState屬性仍然保持「打開」狀態,但是當你嘗試使用它時,你會得到你的異常。例如:
SqlConnection sqlConn;
private bool dbConnectionExists() {
try
{
sqlConn.ChangeDatabase("MyDBname");
return true;
}
catch
{
return false;
}
}
private void button1_Click(object sender, EventArgs e)
{
if (dbConnectionExists())
{
// Connection ok so do something
}
}
的connectionState屬性更改爲「關閉」一旦這種類型的操作執行和失敗,這樣,那麼你可以檢查狀態,如果你想以及。
希望有所幫助。
適用於SQL Server,但不適用於DB2或Oracle。見「暗黑破壞神」的答案。 – Dave 2008-11-04 12:56:34