我在winforms应用程序中使用实体框架。
当我设置 scsb.DataSource =“localhost”时,每件事都运行正常但是当我尝试连接到另一台数据库服务器时,我得到了一个例外:
“基础提供商在开放时失败。”
public DistributionSSEntities1 Connection()
{
var scsb = new SqlConnectionStringBuilder();
scsb.DataSource = "192.168.1.100";
scsb.InitialCatalog = "DistributionSS";
scsb.IntegratedSecurity = true;
//------------------------
EntityConnectionStringBuilder builder = new EntityConnectionStringBuilder();
builder.Metadata ="res://*/Model.Model.csdl|res://*/Model.Model.ssdl|res://*/Model.Model.msl";
builder.Provider = "System.Data.SqlClient";
builder.ProviderConnectionString = scsb.ConnectionString;
DistributionSSEntities1 db = new DistributionSSEntities1(builder.ToString());
return db;
}
答案 0 :(得分:2)
远程Sql是否已设置为允许远程连接?是否允许远程Sql通过Windows防火墙进行访问...有很多原因导致它无法连接。
您正在使用集成安全性 - 这可能适用于本地Sql;但运行WinForm应用程序的网络用户必须拥有访问远程控制台的正确权限。
我建议开始消除以下可能性:
检查目标服务器上的Sql日志。这总是有一个尝试失败的确切原因 - 而不是你通过例外的淡化版本。 (例如,C:\ Program Files \ Microsoft SQL Server \ MSSQL11.SQLEXPRESS \ MSSQL \ Log)
使用sql用户名密码连接到它 - 没有集成安全性以确保它不是那个
防火墙
修改强>
重要的是要记住,有关登录尝试失败的错误消息返回客户端是有目的地模糊或没有信息 - 限制攻击者获得足够的信息来改善攻击(请参阅the technet article以获取证据)。因此,检查Sql Server日志是必要的 - 如果您的登录/连接尝试实际上已将其发送到服务器。
来自文章:
为了提高安全性,返回给客户端的错误消息 故意隐藏身份验证错误的性质。但是,在 SQL Server错误日志,相应的错误包含错误 映射到身份验证失败条件的状态。比较 错误状态到以下列表来确定原因 登录失败。
答案 1 :(得分:0)
public DistributionSSEntities Connection()
{
string ConString = "SERVER=192.168.1.100;DATABASE=DistributionSS;UID=sa;PASSWORD=125;";
SqlConnectionStringBuilder SCB= new SqlConnectionStringBuilder(ConString);
//------------------------
EntityConnectionStringBuilder builder = new EntityConnectionStringBuilder();
builder.Metadata = "res://*/Model.Model.csdl|res://*/Model.Model.ssdl|res://*/Model.Model.msl";
builder.Provider = "System.Data.SqlClient";
builder.ProviderConnectionString = SCB.ConnectionString;
DistributionSSEntities db = new DistributionSSEntities(builder.ToString());
return db;
}