C# 来自SqlConnectionBuilder的异常

C# 来自SqlConnectionBuilder的异常,c#,connection-string,C#,Connection String,连接字符串从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 { Connecti

连接字符串从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
};
string conString=“Provider=SQLOLEDB.1;User ID=tstuser;password=sa123&\”;初始目录=MyDatabase;数据源=本地主机;OLE DB服务=-4”;
var builder=new-SqlConnectionStringBuilder
{
连接字符串=构造
};
当我拆分连接字符串并指定所有属性时-使用生成器都很好:

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"]
};
Dictionary conProperties=新字典(StringComparer.InvariantCultureInogoreCase);
connectionString.Split(“;”)
.Select(t=>t.Split(新字符[]{'='},2))
.ToDictionary(t=>t[0].Trim(),t=>t[1].Trim(),StringComparer.InvariantCultureInogoreCase)
托利斯先生()
.ForEach(t=>conProperties.Add(t.Key,t.Value));
var builder=new-SqlConnectionStringBuilder()
{
UserID=conProperties[“用户ID”],
Password=conProperties[“Password”],
InitialCatalog=conProperties[“初始目录”],
DataSource=conProperties[“数据源”]
};

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

您的第一个示例确实产生了一个异常,指出了问题:

初始化字符串的格式不符合从索引36开始的规范。

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

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.Password = "sa123&<>\\\"'";
Console.WriteLine(builder.ToString());
SqlConnectionStringBuilder builder=new-SqlConnectionStringBuilder();
builder.Password=“sa123&\\””;
Console.WriteLine(builder.ToString());
这将产生:
Password=“sa123&\”“”
——这表明问题出在连接字符串本身,而不是SqlConnectionStringBuilder;输入字符串中的“字符”需要加倍,整个密码用引号括起来

在通过属性设置密码时,您不会遇到此问题,因为生成器会为您正确地转义提供的字符串

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

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

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

(来源:)


由于您的连接字符串以“
”结尾,因此必须遵守最后一句中的换行规则。

谢谢您的回答,但我仍然不明白-为什么我们需要加倍”-它已转义为\“