C# .NET未检测到任何SQL Server实例

C# .NET未检测到任何SQL Server实例,c#,.net,sql-server,C#,.net,Sql Server,一段时间以来,我一直在使用.NET 4.5.1和SQL Server 2012 Express在Windows 8.1设备上开发C#/SQL Server应用程序。一切都完美无瑕。最近,Visual Studio 2015发布了,我决定升级。我还决定升级我的SQL Server 2012,所以我备份了所有内容,卸载了它并安装了SQL Server 2014 Express。配置所有内容并恢复数据库备份后,所有内容仍在本地工作,因为数据库连接数据仍存在于存储的应用程序设置中 当我在另一台设备上测试

一段时间以来,我一直在使用.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实例,我认为这很奇怪,因为它运行在本地。但是,其他一些设备可以检测到SQL Server,因此我认为它不是与防火墙相关的程序。SQL引擎服务和浏览器服务都处于活动状态

我决定升级到Windows 10,重置它(干净安装,没有安装任何SQL Server程序),然后再次运行我的应用程序,因为我的网络中还有其他运行SQL Server的计算机,希望它能够检测到这些。没有。
GetDataSources()
方法在一瞬间返回一个空的
DataTable
,而其他设备需要几秒钟来检测实例并返回正确的列表

更愚蠢的是,ODBC数据源管理员确实检测到了这些网络实例,这让我觉得它是一个与.NET相关的程序

摘要:两台设备没有检测到任何SQL Server实例(即使是本地的),而网络中的其他设备则检测到。

我决定使用它,因为它工作正常,可以实现异步/等待更新,这样就不会阻塞UI

在选择这个实现之前,我还使用
SqlDataSourceEnumerator
类仔细研究了另一个项目,该类工作得非常好。其目标框架属性设置为.NET framework 2.0。我发现当.NET目标版本为3.5或更低版本时,
SqlDataSourceEnumerator
会给出预期的结果(在我的机器上)。随着时间的推移,.NET实现中的某些内容可能发生了变化,导致它在某些特定条件下停止工作


编辑:在我的机器上,我再次安装了SQL Server 2012,并且一切(检测除外,将使用ODBC)都恢复正常。我要感谢大家的投入。

除此之外,在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和我们的应用程序中使用别名,前提是我们自2015年以来使用的VS2013需要4.6。这相当于否定了尝试升级的意义

我不知道问题的确切原因,但我知道在alias中使用计算机的FQDN是可行的。获取实例的端口号并在别名中显式设置它也可以解决问题,但是如果您使用动态端口分配(默认情况下是这样),那么这将很快中断。或者,如果您有一个完整版本的SQL server的单一默认安装,它似乎可以正常工作,别名仅设置为
localhost
(local)

我最好的猜测是.Net 4.6中的一些更改在某种程度上影响了SQL Browser服务,因为如果请求使用动态端口,那么这应该能够将请求路由到正确的实例。当然,有人可能会争辩说,您应该始终明确地设置静态端口号,但谁会理所当然地这样做呢?我曾在Connect上尝试过提高它,以防这是某种错误,但我不确定

编辑 提出了一个连接问题,因为我认为它确实会影响SQL浏览器


为什么不在配置文件中只使用常规连接字符串?您试图解决的问题是什么?我指的是高级问题,比如“在安装时连接到实例,而不是低级”如何检测SQL Server的本地、本地数据库等版本。我不想回答“您如何以我已经尝试的方式解决此问题?”“。我正在使用创建连接字符串,但应用程序需要是用户可配置的,因此能够首先检测SQL实例(然后连接到它们)。我试图解决的问题是,它无论如何都不会连接到SQL Server实例或检测到它。如果您的用户直接选择SQL实例名称,然后我会假设他们是技术性的,在这种情况下,如果没有检测到,为什么他们不能像我在SSMS中那样键入一个实例名称呢?感谢您发布了详细的答案,包括将其隔离到.NET版本-您今天使互联网变得更智能。我发现SqlDataSourceEnumerator提供了预期的结果(在我的机器上)当.NET目标版本为3.5或更低版本时。我发现相同的.Windows10/VS2015/.NET 3.5目标对我适用,但.NET 4、4.5.1、4.5.2或4.6不适用。另外,我发现有趣的是,Visual Studio 2015本身在使用“连接到数据库…”时无法检测到我机器上的任何实例向导。我也安装了VS2008,它没有问题。W