C# 来自SqlConnectionBuilder的异常
连接字符串从Delphi传递到.net应用程序,此代码引发异常: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
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),除非有引号
字符是值中的第一个或最后一个字符
(来源:)
由于您的连接字符串以“
”
”结尾,因此必须遵守最后一句中的换行规则。谢谢您的回答,但我仍然不明白-为什么我们需要加倍”-它已转义为\“