【问题标题】:System.ArgumentException: Keyword not supported: 'password'System.ArgumentException:不支持关键字:“密码”
【发布时间】: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


【解决方案1】:

经过一番摸索后,我设法解决了这个问题。

基本上,我的问题中的 Open 函数每 30 秒从线程函数调用一次,以尝试恢复数据库连接。线程函数正在运行带有 Thread.Sleep(30000) 的 while 循环。我现在已将其更改为计时器 (System.Timers.Timer) 而不是线程函数。计时器每 30 秒触发一次以调用 Open 函数。这样就解决了问题。

我仍然不知道为什么实际会出现此问题以及为什么我的解决方案已解决此问题。但只要它有效,我就很高兴。

【讨论】:

  • 经过进一步测试,此解决方案不适用于 SQL Server 与我的应用程序不在同一台机器上的情况。如果我的应用程序机器和 SQL Server 机器之间存在网络断开连接,我会开始遇到我原来的问题中提到的相同异常。因此,将我的上述答案取消标记为已接受的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-11
  • 1970-01-01
相关资源
最近更新 更多