【问题标题】:C# .Net MysqlConnector ConnectionString Password Problem / IssueC# .Net MysqlConnector ConnectionString 密码问题/问题
【发布时间】:2020-02-22 15:07:10
【问题描述】:

在一些愚蠢的密码问题上需要帮助。以下问题:

使用某些密码无法连接到mysql服务器^^

如果我使用具有相同“连接字符串”详细信息的密码,例如:

以下密码正好在MySql Server中(引号、双引号、分号);

"密码=123456"; // 有效

"密码=123456;"; // 有效

";密码=123;456;' // System.ArgumentException

";pwd=123;456;'" // System.ArgumentException

//Connection String Variant 1:

string connString = string.Format("server={0};port={1};uid={2};pwd={3};database={4};sslmode=preferred",
                tbDbServername.Text.ToLower(),
                (uint)Convert.ToInt32(tbDbServerPort.Text),
                tbDbServerUsername.Text.ToLower(),
                tbDbServerPassword.Password,
                tbDbServerDatabase.Text.ToLower()
                );

//Connection String Variant 2:

string connString = string.Format("server={0};port={1};uid={2};pwd='{3}';database={4};sslmode=preferred",
                tbDbServername.Text.ToLower(),
                (uint)Convert.ToInt32(tbDbServerPort.Text),
                tbDbServerUsername.Text.ToLower(),
                tbDbServerPassword.Password,
                tbDbServerDatabase.Text.ToLower()
                );

我知道这很愚蠢。为什么有人应该使用带有连接字符串详细信息的密码....但是很好解决这个问题。

来自德国的问候 :)

【问题讨论】:

    标签: c# mysql .net


    【解决方案1】:

    使用MySqlConnectionStringBuilder 构造您的连接字符串。它会做任何需要的转义/引用。

    在你的情况下,你会想要这样做:

    MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder()
    {
        Server = tbDbServername.Text.ToLower(),
        Port = (uint)System.Convert.ToInt32(tbDbServerPort.Text),
        UserID = tbDbServerUsername.Text.ToLower(),
        Password = tbDbServerPassword.Password,
        Database = tbDbServerDatabase.Text.ToLower(),
        SslMode = MySqlSslMode.Preferred
    };
    
    string connString = builder.ConnectionString;
    

    【讨论】:

    • 太容易了。非常感谢。作品:)
    • 很高兴为您提供帮助。
    【解决方案2】:

    connection string 中不允许使用某些字符,例如 [] {}() , ; ? * ! @ =.不使用 escape-character。使用; 作为密码的一部分会导致问题,因为它预计会被用作delimiter

    关于特殊字符的特别说明在微软文档中相对奇怪的地方被提及:

    Notes on special character

    如果在 OLE DB 或 ODBC 连接字符串中使用,则为登录名或密码 不得包含以下字符:[] {}() , ; ? * ! @=。 这些字符用于初始化连接或 单独的连接值。

    ConnectionString

    连接字符串的基本格式包括一系列 用分号分隔的关键字/值对。等号 (=) 连接每个关键字及其值。包含包含 分号单引号字符或双引号字符, 值必须用双引号括起来。如果值 同时包含分号和双引号字符,该值可以 用单引号括起来。单引号是 如果值以双引号字符开头,也很有用。 反之,如果值开始,可以使用双引号 用单引号。如果值同时包含单引号 和双引号字符,引号字符用于 每次出现在 价值。

    【讨论】:

    • @Thomas 值得一读的连接字符串格式化程序MySQLdev.mysql.com/doc/refman/8.0/en/…。请注意,当我们从 C# 程序集连接时,它会通过 MySQL/ODBC 连接器连接。
    • 所有这些字符都可以在 MySQL 用户密码中使用,如果正确转义,可以在 MySQL 连接字符串中使用(使用MySqlConnectionStringBuilder 来执行此操作)。
    • @bradleyGraingrr 我同意它可以与适当的转义字符一起使用,并且在链接中也提到了我的答案。我不明白为什么会出现混乱?
    • 您的回答在第一句话中指出:“connection string 中不允许使用某些字符,例如 [] {}() , ; ? * ! @ =.”。对于 MySQL 而言,情况并非如此,这就是问题所在。
    • @BradleyGrainger 我的意思是没有转义字符或其他格式。我看了看链接中提到的。此外,专门针对MySQL 的第二个链接指出MySQL 的连接字符串可以URI-like connection strings or key-value pairs。但重点是当通过MySQL/ODBC 连接器使用连接字符串时,如果没有转义字符,则不允许使用这些字符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    相关资源
    最近更新 更多