0

我在 winforms 应用程序中使用实体框架。

当我设置scsb.DataSource ="localhost"时,一切正常,但是当我尝试连接到另一个数据库服务器时,我遇到了一个异常:

底层提供者在 Open 上失败。”

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;
}
4

2 回答 2

2

远程 Sql 是否已设置为允许远程连接?远程Sql是否被允许通过windows防火墙访问......它无法连接的原因有很多。

您正在使用 Integrated Security - 这可能对本地 Sql 非常有用;但是运行 WinForm 应用程序的网络用户必须具有访问远程框的正确权限。

我建议开始消除可能性,请执行以下操作:

  1. 检查目标服务器上的 Sql 日志。这总是有尝试失败的确切原因 - 而不是您通过异常获得的淡化版本。(例如 C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\MSSQL\Log)

  2. 使用 sql 用户名密码连接到它 - 没有集成安全性以确保它不是那样

  3. 防火墙

编辑

重要的是要记住返回给客户端的有关登录尝试失败的错误消息是故意模糊或没有信息的 - 以限制攻击者获得足够的信息来改进攻击(请参阅technet 文章以获取证据)。因此,检查 Sql Server 日志是必要的——如果您的登录/连接尝试实际上已到达服务器。

来自文章:

为了提高安全性,返回给客户端的错误消息故意隐藏了身份验证错误的性质。但是,在 SQL Server 错误日志中,相应的错误包含映射到身份验证失败条件的错误状态。将错误状态与以下列表进行比较,以确定登录失败的原因。

于 2013-06-05T10:14:24.090 回答
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;
    }
于 2013-06-05T15:10:53.977 回答