2008-11-04 52 views
6

Tôi đang tìm một câu lệnh SQL giả sẽ làm việc từ một kết nối C# SQL để kiểm tra kết nối. Về cơ bản tôi cần phải gửi một yêu cầu đến cơ sở dữ liệu, tôi không quan tâm đến nó, tôi chỉ muốn nó thành công nếu cơ sở dữ liệu vẫn còn ở đó và ném một ngoại lệ nếu cơ sở dữ liệu không phải là cơ sở dữ liệu.Câu lệnh SQL để kiểm tra kết nối?

Kịch bản tôi đang thử là mất kết nối với cơ sở dữ liệu, nơi thuộc tính của Nhà xuất bản SQLConnections dường như vẫn còn "Mở" nhưng không có kết nối.

Trả lời

4

Hầu hết các cơ sở dữ liệu SQL đều có 'bảng' cho mục đích này.

Trong DB2, đó là:

select * from sysibm.sysdummy1 

khi Oracle có, từ bộ nhớ,

select * from dual 

Nó sẽ phụ thuộc vào cơ sở dữ liệu ở phần cuối trở lại.

7

Bạn có thể làm điều này:

Select 1 

Ok, làm thế nào về việc gửi một chuỗi rỗng hoặc không gian trống. Đó là những lệnh hợp lệ cho Sql Server.

+0

Tốt cho SQL Server, nhưng điều đó sẽ không hoạt động đối với DB2 hoặc Oracle. Xem câu trả lời của Pax Diablo. – Dave

1

Bạn sẽ gặp lỗi nếu bạn không thể mở kết nối mới vì db không khả dụng.

Nghe có vẻ như tôi đang giữ kết nối luôn luôn mở (thường là một ý tưởng tồi - một kết nối mới sẽ được mở trước khi một đợt được thực thi). Đây có phải là trường hợp không?

+0

có một kết nối mới được mở khi lô bắt đầu nhưng lô có thể mất tối đa 15 phút. –

+0

ok ... vậy thì sao? sao hàng loạt bị hủy sau một vài phút? Thời gian chờ kết nối của bạn có đủ cao không? (nó mặc định là 2 phút – StingyJack

2

Mất kết nối có thể xảy ra bất cứ lúc nào.

Điều gì sẽ xảy ra nếu các câu lệnh SELECT được đề xuất thực thi tốt, nhưng ngắt kết nối ngay lập tức sau khi (thực hiện thành công) thực thi chúng?

+0

Nếu bạn chỉ cần viết một kiểm tra sức khỏe nó vẫn có thể hữu ích để biết kết nối cơ sở dữ liệu là còn sống (hoặc quan trọng hơn, không còn sống) tại một thời điểm cụ thể trong thời gian. –

1

chọn getdate()

1

Phương pháp đơn giản nhất là thực hiện lựa chọn không có gì.

SELECT N'Test' 
0

Sẽ tốt hơn nếu bạn nắm bắt ngoại lệ không được kết nối của thực hiện cho câu lệnh EVERY sql bạn thực hiện, thay vì sử dụng câu lệnh giả để kiểm tra kết nối. Tôi đã thấy các hệ thống mà trên đó 10% thời gian CPU cơ sở dữ liệu được dùng để trả lời các truy vấn giả này.

0

Ví dụ mã Delphi, mà tôi tin tưởng sẽ dễ dàng thích nghi:

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

Một cách để tìm hiểu xem các kết nối cơ sở dữ liệu vẫn không thực sự tồn tại, là cố gắng thực hiện một số hoạt động trên các kết nối . Nếu kết nối đã chết, thuộc tính ConnectionState vẫn còn là "Open", nhưng khi bạn cố gắng và làm một cái gì đó với nó, bạn sẽ nhận được ngoại lệ của bạn. Ví dụ:

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    
     } 
    } 

Thuộc tính connectionState thay đổi thành "Đã đóng" khi hoạt động này được thực hiện và không thành công, vì vậy bạn có thể kiểm tra trạng thái nếu bạn muốn.

Hy vọng điều đó sẽ hữu ích.

Các vấn đề liên quan