我使用C#编写的Windows服务在Windows Server 2012 R2计算机上运行,该计算机也连接到Windows Server 2012 R2服务器上的远程SQL Server 2012实例。
SQL连接字符串在App Config中定义如下:
<connectionStrings>
<add name="destinationConnectionString" providerName="System.Data.SqlClient"
connectionString="Server=10.42.42.10;Database=mydb;User ID=myuser;Password=mypass" />
</connectionStrings>
运行服务时,输出错误日志显示:
System.Data.SqlClient.SqlException(0x80131904):用户登录失败 &#39;为myuser&#39;
错误号码:18456,州:1,等级:14
因此,我检查SQL Server日志以找到有关错误的更多信息并找到此
用户myuser登录失败原因:密码与 登录提供&#34;
来源:登录消息:错误:18456,严重性:14,状态:8。
问题是我知道这些凭据是正确的。我检查过并仔细检查过。
我能够通过在源计算机上打开SQL Server Management Studio,并使用完全相同的服务器,用户ID和密码连接到远程SQL Server来证明凭据有效,并使用&#34; SQL Server身份验证&#34;验证模式。
事实上,我有2个不同的用户,我可以使用SSMS连接,但使用Windows服务失败。如果我能够在SSMS中直接使用混合模式auth连接到远程计算机。为什么不在我的Windows服务中?
我在这里不知所措,有人可以提出问题的原因吗?
编辑:我甚至可以使用以下命令成功连接到远程计算机:
sqlcmd -S 10.42.42.10 -U myuser -P mypass -d mydb
答案 0 :(得分:3)
指定初始数据库的正确语法是:
服务器= 10.42.42.10; 初始目录 = mydb;用户ID = myuser;密码= mypass
我最好的猜测是它忽略了你的字符串中的“数据库”,并且可能试图连接到登录的默认数据库设置(可能是主人?)并且至少没有公共角色。虽然我发现“数据库”是一个有效的替代方案。
密码中有一个字符可能会绊倒它。分号和等号将特别成问题。尝试在用户名和密码周围加上双引号,如:
服务器= 10.42.42.10;初始目录= mydb;用户ID =“myuser”;密码=“mypass”
如果您的密码中有引号,则每次出现时都必须将其替换为两个。
一旦建立了连接字符串,就必须确保它将在XML中正确解析。这意味着转义控制字符和其他特殊字符,例如:
< with <
> with >
& with &
' with '
" with "
如果您在浏览器中打开您的应用配置文件,它应该显示它是否正常。
我建议将整个连接字符串的内容添加到服务的输出日志中。这样你就可以看到它的样子。在您尝试打开连接之前,请使用以下命令:
string connStr = ConfigurationSettings.AppSettings("myConnectionString");
然后将connStr值输出到日志。它将向您显示至少使用的值。
答案 1 :(得分:1)
您可以在密码中使用一些特殊字符,这是为XML保留的。如果是这样,您将需要使用转义字符作为替代。
例如,如果您的密码为PASS<WORD
,则配置文件中的有效条目为:PASS<WORD
答案 2 :(得分:1)
我已使用此site来查找正确的模式
你拥有的是有效的: Server = myServerAddress; Database = myDataBase; User Id = myUsername; 密码= MYPASSWORD;
您是否尝试连接到实例化的SQL Server? 服务器= 10.42.42.10 / SomeInstance
答案 3 :(得分:1)
我建议在连接字符串中输入密码后面加分号;
。也许它被奇怪地解析了。
我也想知道:你的实际密码是否是分号?
答案 4 :(得分:1)
也许您正在尝试使用Windows帐户,但也有一个以相同方式命名的SQL帐户。如果是这样,请确保在Windows帐户前添加域名前缀。例如。您可能拥有MYDOMAIN\sa
的Windows帐户P@ssword
,而SQL服务器帐户为sa
且密码为P@ssw0rd
。
要确定存在哪些帐户,请以管理员身份登录SQL服务器,并检查&#34;安全&#34;下列出的帐户。服务器本身和感兴趣的数据库的节点。
答案 5 :(得分:0)
我遇到了同样的问题,这是我的解决方案:
我发现我正在使用SQL服务器的命名实例并将我的连接字符串的Server
从Server=localhost
更改为Server=localhost\SQLEXPRESS
,一切正常对我有用! :)