我使用.NET 4.5.1和SQL Server 2012 Express在Windows 8.1设备上开发了一段时间的C#/ SQL Server应用程序。这一切都完美无瑕。最近,Visual Studio 2015已经发布,我决定升级。我还决定升级我的SQL Server 2012,所以我支持所有内容,卸载它并安装了SQL Server 2014 Express。配置完所有内容并恢复数据库备份后,所有内容仍在本地工作,因为数据库连接数据仍存在于存储的应用程序设置中。
当我在另一台设备上测试应用程序时,我发现它无法再连接到SQL Server实例,并且无法使用
检测到它System.Data.DataTable instances = SqlDataSourceEnumerator.Instance.GetDataSources();
应用程序无法在我的开发机器上检测到SQL Server实例,我认为这很奇怪,因为它正在运行 local 。但是,其他几个设备可以检测SQL Server,因此我不认为它是防火墙相关程序。 SQL引擎服务和浏览器服务都是活动的。
我决定升级到Windows 10,重置它(干净安装,没有安装任何SQL Server程序)并再次运行我的应用程序,因为我的网络中有其他运行SQL Server的计算机,希望它能检测到这些。它没有。 GetDataSources()
方法在瞬间返回空DataTable
,而其他设备需要几秒钟来检测实例并返回正确的列表。
更愚蠢的是,ODBC数据源管理员 检测到这些网络实例,让我觉得它是一个与.NET相关的程序。
摘要:两个设备无法检测任何 SQL Server实例(甚至是本地),而网络中的其他设备则会检测到。
答案 0 :(得分:4)
我决定使用this ODBC implementation,因为它正常工作并且可以实现异步/等待更新,因此它不会阻止用户界面。
在选择这个实现之前,我还使用SqlDataSourceEnumerator
类来探索另一个项目,该项目运行良好。其Target框架属性设置为.NET Framework 2.0。我发现当.NET目标版本为3.5或更低时,SqlDataSourceEnumerator
会给出预期的结果(在我的机器上)。 .NET实现中的某些内容可能会随着时间的推移而发生变化,导致它在某些特定条件下停止工作。
编辑我再次安装了SQL Server 2012,所有内容(除了检测,将使用ODBC)再次正常工作。我要感谢大家的意见。
答案 1 :(得分:2)
除此之外,我们在VS2015 / .Net 4.6安装后遇到了类似的问题。我们的开发人员使用SQL Express 2012 x64(在某些情况下主要是默认实例或命名实例,但默认情况下Express是一个名为SQLEXPRESS的命名实例)和一个别名,用于从连接字符串中删除任何计算机名称变体(生产使用DNS条目) 。别名设置为使用TCP / IP,服务器名称为localhost \ instance。
但4.6使用别名时使用别名并且实体框架无法连接,使用别名时SSMS也无法连接。如果我删除4.6并修复4.5.2,这似乎被4.6安装损坏,那么我们可以使用SSMS中的别名和我们的应用程序,只要我们使用VS2013自2015年需要4.6。这相当否定了尝试升级的重点。
我不确切知道导致问题的原因,但我知道使用别名中使用的计算机的FQDN可以正常工作。获取实例的端口号并在别名中明确设置它也可以解决问题,但如果您使用动态端口分配(默认情况下这样做),那么这将很快破坏。或者,如果您有一个完整版SQL服务器的单个默认安装,它似乎继续正常工作,别名设置为localhost
,(local)
或.
。
我最好的猜测是.Net 4.6中的某些更改会以某种方式影响SQL浏览器服务,因为如果它们使用动态端口,则应该将请求路由到正确的实例。当然,可以说你应该总是明确地设置一个静态端口号,但是谁当然这样做呢?我曾经玩过连接它以防万一这是一种bug,但我不确定。
引发了Connect问题,因为我认为它真正影响了SQL Browser。
https://connect.microsoft.com/VisualStudio/feedback/details/1719418