我正在寻找一个可以从C#SQL连接工作的伪SQL语句,以检查连接性。
基本上我需要向数据库发送请求,我不关心它返回什么我只是希望它在数据库仍然存在时成功并且如果数据库不存在则抛出异常。
我正在测试的场景是丢失了与数据库的连接,其中SQLConnections State属性似乎仍然是“Open”但没有连接。
答案 0 :(得分:8)
你可以这样做:
Select 1
好的,如何发送空字符串或空格。这些是Sql Server的有效命令。
答案 1 :(得分:5)
大多数SQL数据库都有一个“表”用于此目的。
在DB2中,它是:
select * from sysibm.sysdummy1
而Oracle从内存中
select * from dual
它将取决于后端的数据库。
答案 2 :(得分:2)
连接丢失可能随时发生。
如果建议的SELECT语句执行正常,但连接在(成功)执行后立即中断会怎样?
答案 3 :(得分:2)
最简单的方法是执行一个不做任何操作的选择。
SELECT N'Test'
答案 4 :(得分:1)
如果由于数据库不可用而无法打开新连接,则会出现错误。
听起来像你一直保持连接打开(这通常是一个坏主意 - 在批处理执行之前应该打开一个新连接)。是这种情况吗?
答案 5 :(得分:1)
选择getdate()
答案 6 :(得分:0)
最好是为执行的每个sql语句捕获实现的未连接异常,而不是使用虚拟语句来测试连接。我已经看到系统中花费了超过10%的数据库CPU时间来响应这些虚拟查询。
答案 7 :(得分: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;
答案 8 :(得分: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属性将更改为“已关闭”并失败,因此您可以根据需要检查状态。
希望有所帮助。