【问题标题】:Exception from SqlConnectionBuilder来自 SqlConnectionBuilder 的异常
【发布时间】:2018-08-10 03:30:34
【问题描述】:

一个连接字符串从 Delphi 传递到一个 .net 应用程序,此代码引发异常:

string conString = "Provider=SQLOLEDB.1;User ID=tstuser;password=sa123&<>\"';Initial Catalog=MyDatabase;Data Source=localhost;OLE DB Services=-4";

var builder = new SqlConnectionStringBuilder
{
    ConnectionString = conString
};

当我拆分连接字符串并分配所有属性时 - 构建器都很好:

Dictionary<string, string> conProperties = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);

connectionString.Split(';')
            .Select(t => t.Split(new char[] { '=' }, 2))
            .ToDictionary(t => t[0].Trim(), t => t[1].Trim(), StringComparer.InvariantCultureIgnoreCase)
            .ToList()
            .ForEach(t => conProperties.Add(t.Key, t.Value));

var builder = new SqlConnectionStringBuilder()
{
    UserID = conProperties["User ID"],
    Password = conProperties["Password"],
    InitialCatalog = conProperties["Initial Catalog"],
    DataSource = conProperties["Data Source"]
};

SqlConnectionStringBuilder 中是否有错误,或者我遗漏了什么?

【问题讨论】:

    标签: c# connection-string


    【解决方案1】:

    您的第一个示例确实产生了表明问题的异常:

    Format of the initialization string does not conform to specification starting at index 36.

    子字符串索引对应于密码字段。一些代码在这里演示了这个问题:

    SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
    builder.Password = "sa123&<>\\\"'";
    Console.WriteLine(builder.ToString());
    

    这会产生:Password="sa123&amp;&lt;&gt;\""'"——这表明问题出在连接字符串本身而不是 SqlConnectionStringBuilder;输入字符串中的 " 字符需要加倍,整个密码用引号括起来。

    通过属性设置密码时不会点击此选项,因为构建器会为您正确转义提供的字符串。

    编辑:必须这样做的原因由连接字符串语法解释。您在问题中使用的\" 转义了编译器" 字符,因此它不会将" 视为终止字符串文字。然而,实际的问题是紧随其后的';连接字符串的语法对于如何处理引号字符有不同的规则:

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

    要在字符串值中包含前面或后面的空格,值 必须用单引号或双引号括起来 分数。整数、布尔值或 枚举值被忽略,即使用引号引起来。 但是,字符串文字关键字或值中的空格是 保存。单引号或双引号可以在一个 不使用分隔符的连接字符串(例如,Data Source= my'Server or Data Source= my"Server),除非是引号 character 是值中的第一个或最后一个字符。

    (来源:SqlConnection.ConnectionString Remarks

    由于您的连接字符串以' 结尾,因此它受最后一句中的换行规则的约束。

    【讨论】:

    • 谢谢你的回答,但我还是不明白 - 为什么我们需要加倍“ - 它已经转义为 \”
    猜你喜欢
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多