问题标签 [sqloledb]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
450 浏览

sql-server - VBA runtime error for primary key violation when calling ADO RecordSet.MoveFirst method

I'm using SQLOLEDB provider through ADODB to work with a SQLServer 2012R2 database using VBA running in Excel.

I have no problems navigating through a RecordSet generated from a SELECT statement generated through a RecordSet.Open method.

I recently started having a RecordSet returned from INSERT statements through the use of an OUTPUT clause to return the ID for a newly inserted Record. I then call the Connection.Execute method with the SQL statement and obtain a RecordSet from this with the new ID value.

If the table in which the new record was inserted has Primary Key(s) defined, then trying to call RecordSet.MoveFirst on this returned RecordSet results in the Primary Key Violation exception being thrown as a VBA Runtime error. If there are no Keys defined on the table, then I do not get the error.

I'm getting the error in a generic function that I wrote which iterates through the record set to pull out data into an application-specific object.
I'm using the RecordSet.MoveFirst method prior to looping through the RecordSet to make sure that I'm at the beginning of the RecordSet, just in case the RecordSet had been touched by another method that changed the cursor position.

I also call the MoveFirst method in another function that gets the number of Records in the RecordSet, since I couldn't find any other way with the default cursor to find out how many records there are. The exception is raised in either of these two methods, whenever MoveFirst is called.

I noticed that the RecordSet returned from the OUTPUT Clause has the .Source property set to the full INSERT statement that was originally issued.

The property RecordSet.LockType is adLockReadOnly and .EditMode is adEditNone.

One thing that I don't understand here is why MoveFirst would result in this behavior, where it seems to be trying to repeat the INSERT statement just because I'm moving the cursor. I don't think it's actually doing that, because when I try this on a table with no keys defined I do not get an extra duplicate record being inserted.

Advice? Perhaps there is a better way to manage cursor positioning and iterating through the RecordSet?

I suppose I could try placing an "On Error Resume Next" statement before calling MoveFirst, but that doesn't seem like a good solution, even if it would work.

0 投票
0 回答
198 浏览

c# - 在 EF 6 连接字符串中使用 provider=SQLOLEDB

过去几年,不同的 sql 客户端正在使用旧的连接字符串。连接字符串具有旧语法:“Provider=SQLOLEDB”。EF6 显然使用了不同的 SQL 客户端和提供程序。

所以我的问题是,是否存在将 EF6 配置为使用提供程序或连接提供程序工厂的方法,它知道如何处理连接字符串中的提供程序关键字?目前我收到错误消息“不支持关键字:'提供者'。” 我希望有一种方法可以避免更改不涉及运行时调整的连接字符串以从原始连接字符串中删除关键字。谢谢。

0 投票
0 回答
124 浏览

sql-server - ADODB、SQLSERVER、SERVERPROPERTY:使用 sqloledb 或 ODBC 驱动程序的不同类型?

我正在尝试将我的 VBS 脚本之一从使用 SQLOLEDB 切换到 ODBC 驱动程序。这么久一切都像预期的那样工作 - 除了一件事:

从 MSSQL 实例获取SERVERPROPERTY("is_clustered")时,使用每个驱动程序的结果值不同。

这是示例脚本的输出(脚本如下):

有谁知道我做错了什么或我的代码中缺少什么?

哦,是的,代码......这是示例脚本本身:

提前谢谢了!

BR,马塞尔

0 投票
1 回答
1087 浏览

sql-server - 从 sqloledb 切换到 SQL Server 的 odbc 驱动程序 13

我想Always Encrypted使用SQL Server 2016 SP1. 为了做到这一点,我需要使用新的ODBC Driver 13.1 for SQL Server而不是当前的sqloledb

似乎它正在破坏我的应用程序,例如,何时XML返回。这里,据说:

为了利用 SQL Server 2005 中引入的新功能,例如多个活动结果集 (MARS)、查询通知、用户定义类型 (UDT) 或新的 xml 数据类型,使用 ActiveX 数据对象 (ADO) 的现有应用程序) 应使用 SQL Server Native Client OLE DB 提供程序作为其数据访问提供程序。

那么,这就是说我需要重写代码,XML用在哪里呢?

我知道,Microsoft已弃用已弃用的sqloledb驱动程序,但 2018 年 3 月推出的第一个版本将不支持Always Encrypted- 所以,我不想等待。

0 投票
1 回答
10524 浏览

sql-server - OPENROWSET 因“无效的授权规范”而失败

我正在尝试OPENROWSET在 SQL Server 2008 SP1 中使用:

  • OLE DB 提供程序SQLOLEDB
  • 连接字符串Data Source=hydrogen;User ID=scratch;Password=scratch;
  • 命令文本select * from users

查询失败:

链接服务器“(null)”的 OLE DB 提供程序“SQLNCLI10”返回消息“无效的授权规范”。

链接服务器“(null)”的 OLE DB 提供程序“SQLNCLI10”返回消息“无效的连接字符串属性”。

消息 7399,级别 16,状态 1,第 1 行
链接服务器“(null)”的 OLE DB 提供程序“SQLNCLI10”报告错误。身份验证失败。

消息 7303,级别 16,状态 1,第 1 行无法初始化链接服务器“(null)”的 OLE DB 提供程序“SQLNCLI10”的数据源对象。

注意:服务器和凭据当然是正确的。

但我没有使用 SQLNCLI10

令人困惑的是错误提示有人正在使用 OLE DB Provider SQLNCLI11 (SQL Server Native Client 11.0)

链接服务器“(null)”的 OLE DB 提供程序“SQLNCLI10”返回消息

那不是我正在使用的 OLEDB 提供程序。

  • 我没有使用 OLE DB 提供程序:SQLNCLI10 (SQL Server Native Client 11.0)
  • 我正在使用 OLE DB 提供程序:SQLOLEDB (Microsoft OLE DB Provider for SQL Server)

所以有些事情是非常错误的。

随机尝试

当然我们可以尝试随机的东西:

  • 在连接字符串中指定提供者

    /li>
  • 尝试使用SQLNCLI10OLE DB 提供程序:

    /li>
  • 尝试使用SQLNCLI10OLE DB 提供程序:

    /li>
  • 尝试使用集成安全性

    /li>

除了不起作用之外,这些尝试也没有回答我的问题:

为什么认证失败?

更多调试

使用无效的提供者- 证明它忽略了我的提供者。

服务器似乎坚持要我使用“本机客户端”。如果我请求无效的 OLE DB Provder 会发生什么 - 例如asdfasf

嗯,这是有道理的。所以它只是有时会忽略我的提供者。

使用有效的非 SQL Server 提供程序

如果我使用不是SQL Server 的有效提供程序怎么办:

那讲得通; 办公室没有安装。

提供者的连接字符串属性SQLNCLI11

属性集DBPROPSET_DBINIT

属性集DBPROPSET_SQLSERVERDBINIT

SQLOLEDB 和 SQLNCLI11 支持的 OLE DB 属性比较

属性集: DBPROPSET_DBINIT

属性集: DBPROPSET_SQLSERVERDBINIT

0 投票
3 回答
932 浏览

excel - Excel VBA 用户表单到 SQLOLEDB 连接可在本地工作,但不能在远程工作 - 运行时错误“-2147467259 (80004005)”:[DBNETLIB]

现在已经研究了一个星期,我仍然无法解决这个问题。我创建了一个 Excel VBA 用户表单,该表单在单击命令按钮(称为“保存”)时将数据插入 SQLOLEDB 连接(SQLEXPRESS 2017)。在本地(本地主机)它就像一个魅力。列中的所有数据都成功插入到 SQL DB 表中。没有任何错误。

但是,当任何客户端尝试执行相同的操作时,我会收到运行时错误“-2147467259 (80004005)”:[DBNETLIB](ConnectionOpen (connect()).]SQL Server 不存在或访问被拒绝。

这是我到目前为止所尝试的:

  • 我在我的 SQL Server Management Studio 中为客户端创建了一个登录名。
  • 我已授予客户端对 dbo.Table 的插入权限。
  • 我已确保在 SQL Server Management Studio 的服务器属性中的“连接”中选中“允许远程连接到此服务器”。
  • 我在我的 Windows 防火墙中添加了入站和出站规则,以在我的计算机中打开端口 1433,这是安装服务器的位置。
  • 我在 Windows 防火墙中添加了入站和出站规则,以在我的客户端计算机中打开端口 1433。
  • 我检查了我的 ODBC 数据源管理器(32 位和 64 位),发现我安装了我的客户端没有的 SQL Server Native Client RDA 11.0。我研究了一下,无法再安装这个版本了。我还发现了 SQL Server Compact 3.5,据说它带有 RDA 的替代品,称为 ADO.NET 的同步服务。我在我的计算机和客户端中都安装了 32 位和 64 位版本。
  • 我也尝试过使用我自己的登录信息建立远程桌面连接,但是当我测试我的用户表单或运行我的测试器时。UDL 尝试连接到此服务器我收到相同的错误消息。

这是我用来建立此连接的字符串:

我的问题是:

我如何设法让客户端成功插入到这个 SQL 数据库/表中?

问题出在哪里?它是否位于我的计算机设置中?它是否位于我的客户端计算机设置中?它是否位于我的 SQL Server Management Studio 中(可能是错误/缺少权限)?

我提前感谢您的帮助!问候,戴夫。

0 投票
0 回答
311 浏览

c++ - 从 SQLOLEDB 切换到 SQLNCLI 或 MSOLEDBSQL 提供程序后绑定期间出现错误 80040e21 和 DBBINDSTATUS_BADBINDINFO

我正在处理一些使用 OLE DB 连接到 SQL Server 数据库的遗留 C++ 代码。我需要从旧的 SQLOLEDB 提供程序转移到更现代的提供程序(SQLNCLI、SQLNCLI10、SQLNCLI11 或 MSOLEDBSQL)。据推测,这应该可以通过仅更改提供程序来实现,但是当我切换到任何较新的提供程序时,我遇到了 80040e21 错误(“多步 OLE DB 操作生成错误”)(与所有四个提供程序完全相同的错误)列出的供应商)。在为所有列添加绑定条目后调用 Bind 时会发生这种情况。稍微挖掘一下,当 Bind 调用 IAccessor::CreateAccessor 时似乎会引发错误,并且其中一列正在返回错误的绑定状态 (DBBINDSTATUS_BADBINDINFO)。有问题的列是 VARCHAR(15),并且我的测试表中的另一列(INTEGER)没有显示错误的绑定状态。列的 DB 类型是 DBTYPE_STR,缓冲区分配了 24 个字节(16 个用于数据,4 个用于长度,4 个用于状态)。

我发现的唯一与 DBBINDSTATUS_BADBINDINFO 相关的文档位于https://msdn.microsoft.com/en-us/library/ms720969.aspx,那里讨论的所有可能原因似乎都不适用于我的案例。当我将提供程序切换回 SQLOLEDB 时,一切正常(使用完全相同的表和参数),因此 SQLNCLI 提供程序(以及新的 MSOLEDBSQL 提供程序)中肯定发生了一些变化。有没有人知道新的供应商可能发生了什么变化导致这种情况(以及我可以做些什么来解决错误)?

0 投票
0 回答
1021 浏览

sql-server - 如何在我的连接字符串中使用 SQL Server 应用程序角色

我当前的应用程序使用非常强大的凭据来访问 SQL Server 后端数据库。我想通过使用创建的应用程序角色来提高应用程序的安全性。

例如,如果我创建了一个名为app-role,并使用密码:

我想通过在连接字符串中指定它来在连接期间自动启用该应用程序的使用。我不想冒险在软件中的任何地方意外没有重新设计调用:

所以很明显我希望这在连接过程中自动发生。

奖金喋喋不休

应用程序角色功能最初是在 SQL Server 2000 中添加的。

奖金阅读

0 投票
0 回答
536 浏览

perl - Windows 10 上的 ActiveState Perl 和 Win32::OLE

我试图弄清楚一些用于在我们的网站上报告的旧 Perl 正在做什么。我已经安装了 ActiveState Perl,除了 Perl 尝试打开数据库连接时,一切似乎都在工作。显示以下错误:

Perl 的违规行是:

还使用了以下使用语句:

如何在 Windows 10 上安装(或配置或?)提供程序?

0 投票
0 回答
572 浏览

sql-server - 使用 ADO 和 Provider = SQLOLEDB 返回选择查询

我的最终目标是针对 sql-server 运行 sql 查询并在电子表格中捕获返回的数据。以下代码大致反映了我当前的设置并且可以正常工作。该设计允许我从文本文件中读取 sql 代码并将其提交到 sql-server。“Sub ExecuteCRUD”提交第一个 sql 脚本以准备数据并将结果转储到临时表中。“Function loadRecordset”提交一个相对简单的选择查询并将返回的数据捕获到一个记录集中,然后我用它来填充一个电子表格。

我的设置中有几个“变量”可能与讨论相关。

  1. 我的 4 套 Sql 代码

  2. ConnectionString(我的 vba 代码的一部分)

  3. 我其余的 vba 代码

    一个。Dbo.ConnectionString = "Provider=MSDASQL;DRIVER=SQL Server;SERVER= myserver ;UID= id ;PWD=密码;DATABASE=数据库;"

    湾。Dbo.ConnectionString = "Provider=SQLOLEDB;Data Source= myserver ;Initial Catalog= database ;User ID= id ;Password= password ;"

最初,我改变的只是连接字符串。直接结果是连接字符串版本 a 完美运行。使用 b 版本,我的设置将失败,而 sql-server 没有任何错误。

使用连接字符串版本 b,“Sub ExecuteCRUD”(数据准备步骤)仍然可以顺利运行。作为我的第一个 sql 脚本的结果,我可以验证临时表是在 tempdb 中创建的。

“Function loadRecordset”将通过行运行而不会出现任何错误,直至并包括“rs.open”。(我检查了错误,没有任何来自 ado 连接的错误)。

只有后面的代码,在使用记录集拷贝数据时会报错:“对象关闭时不允许操作”。

通过一些测试,我将问题范围缩小到 sql 代码。

我必须在这里重申。使用 ODBC 提供程序时,我的初始 sql 代码集运行良好。事情只是使用 OLEDB 提供程序进行。

使用 OLEDB 提供程序,“有问题的”sql 代码是Use databaseABC。此外,使用 ado,我的设置将 4 组 sql 代码提交到 sql server。第一组 sql 代码准备数据(创建表、插入数据、创建索引、使用 while 循环填充数据、使用递归 ctes 等)。在这第一组sql代码中,还包含了Use databaseABC ,它会成功执行。提交的另外 3 组 sql 代码只是以获取数据为目的的 select 查询。当使用databaseabc中包含使用databaseabc时,该操作的操作失败而没有任何错误。在我取出Use databaseABC之后,一切都将在 OLEDB 提供者世界中正常运行。

使用databaseABC不是选择查询的必要部分。使用它可以省去在连接子句中一直指定数据库名称的麻烦。

在这一点上,我的好奇心是双重的

  1. 为什么使用databaseABC会导致失败,特别是仅在使用 OLEDB 提供程序时,更具体地说,仅在运行选择查询时。
  2. 发生故障时,sql-server 或驱动程序是否应该产生任何错误?检查和验证的正确方法是什么?