2008-11-04 45 views
6

我正在尋找將從C#SQL連接檢查連通性的虛擬SQL語句。用於檢查連接性的SQL語句?

基本上我需要發送一個請求到數據庫,我不在乎它返回什麼我只是希望它是成功的,如果數據庫仍然存在,並拋出一個異常,如果數據庫不是。

我正在測試的場景是與數據庫的連接丟失,其中SQLConnections狀態屬性似乎仍然是「打開」但沒有連接。

回答

4

大多數SQL數據庫都有一個用於此目的的「表」。

在DB2中,它是:

select * from sysibm.sysdummy1 

而甲骨文,從內存,

select * from dual 

它會在後臺取決於數據庫。

7

你可以這樣做:

Select 1 

好了,如何發送一個空字符串或空白。這些是Sql Server的有效命令。

+0

適用於SQL Server,但不適用於DB2或Oracle。見「暗黑破壞神」的答案。 – Dave 2008-11-04 12:56:34

1

如果由於數據庫不可用而無法打開新連接,則應該會出現錯誤。

這聽起來像你一直保持連接打開(這通常是一個壞主意 - 一個新的連接應該在批次執行之前打開)。是這樣嗎?

+0

是a批次開始時打開一個新連接,但該批次可能需要15分鐘以上。 – 2008-11-04 13:28:52

+0

好的...那麼是什麼?幾分鐘後該批次中止嗎?您的連接超時設置足夠高嗎? (默認爲2分鐘 – StingyJack 2008-11-04 14:20:58

2

連接丟失可能隨時發生。

如果建議的SELECT語句執行正常,但連接在執行後成功執行,會怎樣?

1

select getdate()

1

最簡單的方法是執行不執行任何操作的select。

SELECT N'Test' 
0

最好是爲執行的每個sql語句捕獲實現的未連接異常,而不是使用僞語句來測試連接性。我已經看到系統花費了超過10%的數據庫CPU時間來響應這些虛擬查詢。

0

例子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; 
0

一個發現如果與數據庫的連接仍然實際存在的方式,就是儘量在連接上執行一些操作。如果連接已經死亡,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屬性更改爲「關閉」一旦這種類型的操作執行和失敗,這樣,那麼你可以檢查狀態,如果你想以及。

希望有所幫助。