【发布时间】:2019-03-21 01:53:40
【问题描述】:
我的代码有一个数据库连接健康监控机制,它检查数据库连接状态,如果连接断开,它会在每 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 服务器停止时,问题不会发生。我的应用程序继续重试并且没有遇到此错误。一旦建立了数据库连接,然后它又断开了,重试机制会在一段时间后开始出现此错误。
【问题讨论】:
-
是否正在使用
using语句正确处理您的连接等? -
无论哪种方式,我们都需要Minimal, Complete, and Verifiable example 来解决您的问题。
-
配置中的连接字符串是什么?您可以在没有任何 ip、pass 或 id 信息的情况下安全地共享它吗?
-
@pegasusspect 连接字符串在问题中
-
我知道它是从对象构造器“返回”的那个。我说的是你的配置。
标签: c# sqlconnection