我的代码具有数据库连接运行状况监视程序机制,该机制检查数据库连接状态,如果连接断开,它将尝试每30秒重新连接一次。重试期间,它使用SqlConnection对象,并在调用Open方法之前将连接字符串分配给该对象。相关功能如下。
public int Open(DBConnectionMode ConnectionMode, string server, string database, string user, string password)
{
try
{
SqlConnectionStringBuilder sqlconbuilder = new SqlConnectionStringBuilder();
sqlconbuilder.DataSource = server;
sqlconbuilder.InitialCatalog = database;
if ((server != string.Empty) && (user == string.Empty))
sqlconbuilder.IntegratedSecurity = true;
else
sqlconbuilder.IntegratedSecurity = false;
sqlconbuilder.UserID = user;
sqlconbuilder.Password = password;
if (ConnectionMode == DBConnectionMode.LOCAL)
{
// oConnection is of type SqlConnection
oConnection.ConnectionString = sqlconbuilder.ConnectionString;
oConnection.Open();
}
else
{
oConnectionRemote.ConnectionString = sqlconbuilder.ConnectionString;
oConnectionRemote.Open();
}
//update global connected indicator
if (oCommand.Connection.State == ConnectionState.Open)
isConnected = true;
else
isConnected = false;
return 0;
}
catch (InvalidOperationException ex)
{
return (int)DBErrorCode.CONNECTION_OPEN_INVALID_PARAMS;
}
catch (SqlException ex)
{
return (int)DBErrorCode.CONNECTION_ERROR;
}
catch (Exception ex)
{
throw (ex);
}
}
sqlconbuilder.ConnectionString返回的连接字符串如下。
Data Source=UK-NHAM-2016-01;Initial Catalog=ArcPubCfg;Integrated Security=False;User ID=sa;Password=xxxxxxx
在前几次重试期间,没有任何问题,但是随后我开始出现以下错误。
System.ArgumentException: Keyword not supported: 'password'
我已将错误缩小到此代码行。
oConnection.ConnectionString = sqlconbuilder.ConnectionString;
我已经确认连接字符串保持不变。一旦开始出现此错误,此行将继续失败。在每次重试期间,我都会重新创建每个相关的对象,但是结果是相同的。
任何想法可能出什么问题吗?
编辑:有趣的是,在启动应用程序时停止SQL Server时不会发生此问题。我的应用程序继续重试,没有遇到此错误。建立数据库连接后,然后断开连接,一段时间后,重试机制将开始收到此错误。
答案 0 :(得分:0)
挠头后,我设法解决了这个问题。
基本上,每30秒就会从线程函数中调用我问题中的 Open 函数,以尝试恢复数据库连接。线程函数正在使用 Thread.Sleep(30000)运行while循环。我现在将其更改为计时器( System.Timers.Timer ),而不是线程函数。计时器每30秒触发一次,以调用 Open 功能。这样就解决了这个问题。
我仍然不知道为什么这个问题实际上发生了,为什么我的解决方案解决了这个问题。但是只要有效,我就会很开心。