ome*_*fer 22 .net c# sql sql-server connection
我有以下代码来测试数据库连接,它会定期运行以测试数据库可用性:
private bool CheckDbConn()
{
SqlConnection conn = null;
bool result = true;
try
{
conn = DBConnection.getNewCon();
ConnectionState conState = conn.State;
if (conState == ConnectionState.Closed || conState == ConnectionState.Broken)
{
logger.Warn(LogTopicEnum.Agent, "Connection failed in DB connection test on CheckDBConnection");
return false;
}
}
catch (Exception ex)
{
logger.Warn(LogTopicEnum.Agent, "Error in DB connection test on CheckDBConnection", ex);
return false; // any error is considered as db connection error for now
}
finally
{
try
{
if (conn != null)
{
conn.Close();
}
}
catch (Exception ex)
{
logger.Warn(LogTopicEnum.Agent, "Error closing connection on CheckDBConnection", ex);
result = false;
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
和:
static public SqlConnection getNewCon()
{
SqlConnection newCon = new SqlConnection();
newCon.ConnectionString = DBConnection.ConnectionString; // m_con.ConnectionString;
newCon.Open();
return newCon;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:这会按预期工作吗?
具体来说,我关心的是测试ConnectionState
.状态是否可能是:连接(因为Open()
是同步的)?
在那种情况下我该怎么办?
提前谢谢,奥梅尔
Ram*_*rai 46
你可以这样试试.
public bool IsServerConnected()
{
using (var l_oConnection = new SqlConnection(DBConnection.ConnectionString))
{
try
{
l_oConnection.Open();
return true;
}
catch (SqlException)
{
return false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Dus*_*gen 11
SqlConnection
SqlException
当它无法连接到服务器时会抛出一个.
public static class SqlExtensions
{
public static bool IsAvailable(this SqlConnection connection)
{
try
{
connection.Open();
connection.Close();
}
catch(SqlException)
{
return false;
}
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
using(SqlConnection connection = GetConnection())
{
if(connection.IsAvailable())
{
// Success
}
}
Run Code Online (Sandbox Code Playgroud)
您的代码似乎很好,但您确实需要使用IDisposable模式和一些命名约定:
private bool CheckDbConnection(string connectionString)
{
try
{
using(var connection = new SqlConnection(connectionString))
{
connection.Open();
return true;
}
}
catch (Exception ex)
{
logger.Warn(LogTopicEnum.Agent, "Error in DB connection test on CheckDBConnection", ex);
return false; // any error is considered as db connection error for now
}
}
Run Code Online (Sandbox Code Playgroud)
而且connection.Close()
不应该抛出.只需使用using
块,你就可以了.
Close
因为你刚刚打开它,所以无需测试状态.
关于Broken
国家的更多信息:
已断开与数据源的连接已断开.只有在打开连接后才会发生这种情况.可以关闭此状态下的连接,然后重新打开.(此值保留给产品的未来版本.)
所以真的,没必要测试.
Connecting
如果您处于多线程上下文并且您的连接实例是共享的,则状态可能是catch.但这不是你的情况.