“SQLNCLI”提供程序未在本地计算机上注册。

18

我有一个基于NAnt的脚本,在我的本地计算机上运行,连接到同样运行在我的本地计算机上的SQL Server 2008 Express,使用.sql文件来删除和重新创建数据库 - 这很好,没有问题。

当我在另一台计算机上重新创建了相同的设置时,我的NAnt脚本出现错误,提示:

System.InvalidOperationException: The 'SQLNCLI' provider is not registered on the local machine.
  at System.Data.OleDb.OleDbServicesWrapper.GetDataSource(OleDbConnectionString constr, DataSourceWrapper& datasrcWrapper)
  at System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection)
  at System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
  at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup)
  at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
  at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
  at System.Data.OleDb.OleDbConnection.Open()
  at NAnt.Contrib.Util.SqlHelper..ctor(String connectionString, Boolean useTransaction)
  at NAnt.Contrib.Tasks.SqlTask.ExecuteTask()
  at NAnt.Core.Task.Execute()
  at NAnt.Core.Target.Execute()
  at NAnt.Core.Project.Execute(String targetName, Boolean forceDependencies)
  at NAnt.Core.Project.Execute()
  at NAnt.Core.Project.Run()

我在网上搜索并发现在一个论坛中建议我需要安装 Microsoft SQL Server Native Client,可以在 这个网址 上下载。 (诚然,我只安装了其中的 Native Client 部分)

尽管在我的第二台计算机上已经安装了此软件,但脚本仍然给出相同的错误。有什么建议吗?


应该已经工作了...你试过重新启动机器吗? - Robert Harvey
1
你使用 .Net 中的 OleDB 提供程序有什么特别的原因吗?使用 SqlClient 提供程序,它不需要安装任何驱动程序,一切都随 .net 一起提供。 - Remus Rusanu
如果需要的话,他可能只是想要灵活地写入其他数据库而不是 SQL Server。 - SqlRyan
没有,其实没有什么原因——那是我在某个地方找到的NAnt脚本的一部分,当时没有质疑它。我会进一步研究那部分的。 - Brett Rigby
如果你没有需要,就没必要改变数据库访问方法,所以我不会在那里浪费时间。对于你所做的事情来说,这似乎是一个奇怪的选择,但既然它在你找到的脚本中,那就解释了一切。 - SqlRyan
2个回答

22

SQL Server 2008的正确提供程序是SQLNCLI10.1
而对于SQL Server 2012,则应该使用SQLNCLI11(来源)

遗憾的是,迁移到2008并没有采用这个变化...


你是对的!连接字符串需要引用SQLNCL10,而不是我在脚本中使用的SQLNCLI。干得好。 - Brett Rigby
1
Brett,你说的是SQLNCL10而不是正确的SQLNCLI10。可能是打错了,但我已经复制粘贴了 :-( - Ben McIntyre
编辑后稍微整理了一下。我找不到权威的提供商列表。有些人在互联网上建议 SQLNCLI11.1 也适用于2012年版本。 - Kobi

4

这可能是与x86/x64有关的问题吗?如果工作站是x64,并且您已安装了客户端的x64版本,但您正在尝试运行的应用程序位于x86空间中,则该工作站上可能还需要客户端的x86版本。x86应用程序仅会检查提供程序的x86版本,如果没有看到这样的版本,就会出现这样的错误。x64版本可能足够智能,可以检查两个版本,但也可能会遇到相同的情况。

ODBC也会出现类似问题-x86和x64数据源无法在另一种类型的应用程序中使用-如果您希望某些东西对两种应用程序构建都可见,则需要在每个版本的管理员工具中创建一个ODBC源。


这些电脑是64位机器,所以你可能有发现了...我需要进一步调查! - Brett Rigby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接