0

好吧,我难住了。我正在尝试创建一个 .NET Winforms 应用程序以通过实体框架与数据库通信。我最初创建了一个 ASP.NET MVC3 应用程序(带有单独的 DAL 层),它可以在最初失败后与数据库通信。所以第一次尝试打开连接时,它会超时。如果我然后在浏览器中按 F5,则连接正常!我在我的 Winforms 应用程序中引用了这个 DAL。

  • 我可以通过 SQL Management Studio 中的 SQL Auth 连接到数据库。
  • 我可以在 VS2010 中创建 ADO.NET 数据类(它连接、获取表并将连接字符串存储在 app.config 中)。
  • 但是,一旦我运行 Winforms 应用程序,我就无法连接。我得到了上面提到的异常,带有“超时已过期”的 InnerException。

我将连接字符串从 web.config 复制到 app.config。

SQL 数据库托管在我的称为 SERVER 的 Windows Home Server 上。我在一个工作组中(没有域)。我在 Management Studio 和 VS 中使用 SERVER\SQLEXPRESS 成功连接到它。

我尝试过的事情:

  • 禁用客户端计算机上的防火墙。
  • 在服务器上启用 DTC 并将 msdtc.exe 添加到服务器上的排除列表中。
  • 确保在 SQL 服务器实例上启用了命名管道。
  • 尝试了不同的 SQL 用户。
  • 尝试了在 C# 中构建连接的不同方法。
  • 在我的 WinForms 项目本地生成了一个新的 ADO.NET Data 类(不引用 DAL)。VS 连接良好,读取表格,生成代码。但是正在运行的应用程序会导致“超时已过期”SqlException。

所以运行应用程序连接不成功。当我在 ProcessExplorer 中观看应用程序时,当它尝试使用 SYN_SENT 消息连接远程端口 4845 时,我可以在 TCP 窗口中看到一个条目。不确定这是否正确。

在过去的几天里,我已经用谷歌搜索并搜索了这个,我已经阅读了 Stackoverflow 上所有提到这个异常的文章和回复,但我已经碰壁了。

这是VS读取DB后生成的ConnectionString:

<add name="LLDBEntities" connectionString="metadata=res://*/LLDB.csdl|res://*/LLDB.ssdl|res://*/LLDB.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SERVER\SQLEXPRESS;initial catalog=LLDB;persist security info=True;user id=sa;password=sapwd;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

任何帮助表示赞赏,甚至任何关于如何弄清楚发生了什么的提示。

4

2 回答 2

1

您的连接字符串看起来更像 SQL Server 的连接字符串,而不是 SQL Express。

查看 SQL Express 的连接字符串:SQL Server Express connection string for Entity Framework Code First

于 2012-04-04T22:30:55.720 回答
1

好的,解决了。

我注意到它实际上会在第二次尝试时使用相同的应用程序和连接进行连接。那时我找到了这个链接: http: //kromey.us/2011/06/microsoft-sql-server-2008-times-out-on-first-connection-attempt-447.html

因此,我在实例的 TCP/IP 属性上打开了 SQL Server 配置管理器中 IPAll 动态端口下列出的防火墙端口,现在一切正常。我仍然不知道为什么它会在第二次尝试中通过......

于 2012-04-06T00:39:26.467 回答