问题标签 [sqlncli]

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 回答
8979 浏览

c++ - 使用 C++ 和 SQL Native Client 的 SQLGetData 问题

我有一个使用 SQL Native Client 连接到 MS SQL Server 2000 的 C++ 应用程序。

我正在尝试从包含比最初分配给它的缓冲区提供的更多数据的 TEXT 列中检索结果。为了澄清我的问题,我将概述我在做什么(下面的代码):

  1. 分配 1024 字节的缓冲区使用
  2. 使用 SQLBindColumn 将缓冲区绑定到列
  3. 使用 SQLExecute 执行 SELECT 查询
  4. 使用 SQLFetch 遍历结果
  5. SQLFetch 无法将整个结果返回到我的缓冲区:我想使用 SQLGetData 检索整个列值

上述操作顺序提出了一个问题:SQLGetData 不适用于我的驱动程序中的绑定列。

一个可行的解决方案是使用 SQL_DATA_AT_EXEC 标志,如下面的代码所示。

开始代码:

0 投票
2 回答
4856 浏览

c++ - SQLBindParameter 使用 C++ 和 SQL Native Client 为 SQLPutData 做准备

我正在尝试使用SQLBindParameter我的驱动程序来准备通过SQLPutData. 数据库中的字段是TEXT字段。我的函数是根据这里的 MS 示例制作的:http: //msdn.microsoft.com/en-us/library/ms713824 (VS.85).aspx 。

我已经设置了环境,建立了连接,并成功地准备了我的语句,但是当我调用SQLBindParam(使用下面的代码)时,它始终无法报告:[Microsoft][SQL Native Client]Invalid precision value

以上依赖于使用中的驱动程序返回“N”中的SQL_NEED_LONG_DATA_LEN信息类型SQLGetInfo。我的司机返回“Y”。如何绑定以便我可以使用SQLPutData

0 投票
10 回答
250201 浏览

sql - SELECT 语句后需要行计数:最佳 SQL 方法是什么?

我正在尝试从单个表中选择一列(无连接),并且我需要行数的计数,最好是在开始检索行之前。我已经采用了两种方法来提供我需要的信息。

方法一:

然后

方法 2

我这样做是因为我的 SQL 驱动程序(SQL Native Client 9.0)不允许我在 SELECT 语句上使用 SQLRowCount,但我需要知道结果中的行数,以便在分配信息之前分配一个数组。不幸的是,在我的程序的这个区域中,使用动态分配的容器不是一个选项。

我担心可能会出现以下情况:

  • SELECT for count 发生
  • 出现另一条指令,添加或删除一行
  • SELECT for data 发生,突然数组大小错误。
    - 在最坏的情况下,这将尝试写入超出数组限制的数据并使我的程序崩溃。

方法 2 是否禁止此问题?

另外,这两种方法中的一种会更快吗?如果是这样,是哪个?

最后,是否有更好的方法我应该考虑(也许是一种指示驱动程序使用 SQLRowCount 返回 SELECT 结果中的行数的方法?)

对于那些询问的人,我正在使用带有上述 SQL 驱动程序(由 Microsoft 提供)的 Native C++。

0 投票
1 回答
504 浏览

c++ - 2个SQL连接产生的死锁,每个使用事务,不同的表,两个表之间的外键约束

环境

我正在开发一个使用 SQL Native Client 9.0 与 SQL Server 2000 数据库通信的 C++ 应用程序。

设想

  • 2 个连接打开到 DBMS
  • 每个连接都设置为使用事务
  • 关于Connection1作品的查询TableA
  • 关于Connection2作品的查询TableB
  • TableBkey_id对中的字段有外键约束TableA

我构造了执行以下操作的函数:

我遇到的是查询(1)成功执行,但只要调用 SQLExecute 进行查询(2),调试器就会在永不着陆。

问题

我是否正确地将正在发生的事情诊断为死锁问题?

我收集到,因为Connection1 正在创建一个键TableA但没有提交它,然后由于外键约束,它Connection2试图向其中添加信息TableB,因此该键必须存在于TableA. 因此,SQLExecute查询阻塞,等待事务完成,由于代码的编写方式,在完成写入TableA之前它无法执行此操作。TableB

补充笔记

我可以并且已经围绕这个问题进行了编码,但我想确保我对这个问题的理解是正确的。

0 投票
1 回答
284 浏览

c++ - sqlnclir.rll 被连续加载和卸载

我正在与 SQL Server 2000 通信的 C++ 应用程序中使用 SQL Native Client 9。我现在正在调试一些东西,但我注意到让我感到困扰的事情(主要是因为它造成了严重的混乱)是 sqlnclir。 rll 不断被加载和卸载,并且以下行被垃圾邮件发送到我的调试输出窗口。

“Win32 线程”后的 ID 发生变化,但退出代码始终为 0。

为什么 .rll 会像这样不断地加载和卸载,我该如何防止它发生?

如果上述问题无法回答,我如何防止上述消息被垃圾邮件发送到 MSVC 2005 中的“调试输出”窗口?理想情况下,只针对那组特定的消息?

0 投票
3 回答
2467 浏览

sql - SQL 本地客户端 ODBC 应用程序在 SQLDisconnect 后未断开连接且未池化?

背景:
我正在使用用 C++ 编写的程序,它使用 SQL Native Client 上的 ODBC 建立连接以与 SQL Server 2000 数据库进行交互。

问题:
我的连接被抽象为一个对象,当对象被实例化时打开连接,当对象被销毁时关闭连接。我可以看到对象正在被销毁:它们的析构函数正在触发并且在这些析构函数内部SQLDisconnect( ConnHandle )被调用,然后是SQLFreeHandle( SQL_HANDLE_DBC, ConnHandle ); 但是,使用sp_Who2SQL 中的性能监视器观察连接计数显示连接计数不断增加,尽管有这些连接被摧毁。

在执行运行足够长的函数链以创建数千个这样的对象并因此创建数千个连接之前,这并没有被证明是有问题的。

问:
有没有人见过这样的事情?这可能是什么原因造成的?我最初的谷歌搜索并没有证明很有成效!

编辑:
我已经验证SQLDisconnect返回没有错误。

连接池已关闭。事实上,当我尝试使用 启用它SQLSetEnvAttr时,我的应用程序在第二次调用时崩溃SQLDriverConnect

0 投票
2 回答
722 浏览

c++ - 连接池打开时打开第二个连接时 SQL Native Client 崩溃?

我正在使用一个 C++ 应用程序,该应用程序使用 SQL Native Client 通过 ODBC 与 SQL Server 2000 数据库进行通信。

在做任何数据库工作之前,我分配一个环境句柄如下:

retcode = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &EnvironmentHandle );

这成功完成。

为了启用连接池,在上述语句之前,我调用:

retcode = SQLSetEnvAttr( NULL, SQL_ATTR_CONNECTION_POOLING, (SQLPOINTER) SQL_CP_ONE_PER_HENV, SQL_IS_INTEGER );

SQLSetEnvAttr,当包含时,返回一个好的代码,表示成功。但是,它会导致我的应用程序在第二次SQLDriverConnect调用以建立与数据库的连接时崩溃(注意:此时第一个连接将使用创建SQLDriverConnect并断开使用SQLDisconnect。)如果我将此行注释掉,应用程序将继续没有麻烦。

这可能是什么原因造成的?

0 投票
2 回答
798 浏览

c++ - 升级到 SQL Server 2005:无法将 QNAN 插入浮点列?

背景:
我正在从 SQL Server 2000 迁移到 SQL Server 2005。这是为使用 SQL Native Client 通过 ODBC 与 SQL Server 通信的 C++ 应用程序提供 DB 服务。

问题:
我正在尝试将 QNAN 插入数据库中的浮点列。在我的应用程序中,此值存储为双精度值(值:1.#QNAN00000000000)并作为参数发送到数据库中。这在 SQL Server 2000 中不是问题,但相同的代码在 SQL Server 20005 中给了我以下错误:

传入的表格数据流 (TDS) 远程过程调用 (RPC) 协议流不正确。参数 3 (""):提供的值不是浮点数据类型的有效实例。检查源数据中的无效值。无效值的一个示例是小数位数大于精度的数值类型数据。

问题
是否可以让 SQL Server 2005 接受 QNAN?如果是这样,怎么做?

0 投票
1 回答
3908 浏览

c++ - 将 SQL Provider 从 SQLOLEDB.1 更改为 SQLNCLI.1 会导致应用程序在通过存储过程访问数据时失败

我支持用 MFC/C++ 编写的旧版应用程序。该应用程序的数据库位于 SQL Server 2000 中。我们最近增加了一些新功能,发现当我们将 SQL Provider 从 SQLOLEDB.1 更改为 SQLNCLI.1 时,一些代码试图通过存储过程从表中检索数据失败。

有问题的表非常简单,是通过以下脚本创建的:

基本上是四列,其中 TableKey 是一个标识列,其他所有内容都通过以下脚本填充:

上面还有一长串其他 INSERT INTO 的列表。插入的某些行在其描述中具有特殊字符(如字母上方的重​​音符号)。我最初认为包含特殊字符是问题的一部分,但如果我完全清除表格,然后只用上面没有特殊字符的单个 INSERT INTO 重新填充它,它仍然会失败。

所以我继续...

然后通过以下代码访问此表中的数据:

daxLayer 是应用程序正在使用的第三方数据访问库,尽管我们有它的来源(其中一些将在下面看到。) SP__GET_ALLERGEN_DESC 是用于从表中获取数据的存储过程,它是通过创建的这个脚本:

当 SQL Provider 设置为 SQLNCLI.1 时,应用程序会在以下位置爆炸:

从上面的代码片段。于是我踏入了GetField,如下所示:

这里的罪魁祸首是:

进入 Fields->GetItem 将我们带到:

获取项目

然后将我们带到:

获取值

如果在运行时单步执行时查看 _result,_result 的 BSTR 值是正确的,它的值是表的“描述”字段中的“Egg”。继续遍历所有 COM 释放调用等的跟踪。当我终于回到:

跳过它到下一行,现在应该是 BSTR="Egg" 的 tv 的内容是:

当 GetField 函数尝试将其返回值设置为 tv.BSTR 中的值时

不出所料,它会窒息而死。

那么 BSTR 的值发生了什么变化,为什么它只在提供程序设置为 SQLNCLI.1 时才会发生?

最糟糕的是,我在最上面的代码中使用存储过程注释掉了,只是硬编码了存储过程使用的相同 SQL SELECT 语句,发现它工作得很好,返回的值是正确的。

此外,用户可以通过应用程序向表中添加行。如果应用程序在该表中创建一个新行并通过存储过程检索该行,它也可以正常工作,除非您在描述中包含一个特殊字符,在这种情况下它会正确保存该行但以与上面完全相同的方式再次爆炸在检索该行时。

因此,总而言之,如果可以的话,通过 INSERT 脚本放入表中的行在被存储过程访问时总是会炸毁应用程序(无论它们是否包含任何特殊字符)。用户在运行时从应用程序中放入表中的行可以通过存储过程正确检索,除非它们在描述中包含特殊字符,此时它们会破坏应用程序。如果您在运行时使用代码中的 SQL 而不是存储过程访问表中的任何行,则无论描述中是否存在特殊字符,它都可以正常工作。

任何可以对此有所了解的信息都将不胜感激,我提前感谢您。

0 投票
2 回答
7792 浏览

vb6 - 登录失败,Crystal Reports 9,VB6,sql server,sqlncli

我正在尝试为旧版 vb6 软件构建安装包。软件本身通过 sqlncli(本机客户端)连接到 sql 服务器。我已经打包了所有依赖项并将它们部署到运行winxp和office2003的新机器上。

现在,我可以从目标机器连接到使用 tcp/ip 在其他地方运行的数据库(ms sqlserver 2005)。旧版软件可以很好地连接到数据库,我可以操作数据。但是当我尝试打开水晶报告时,事情变得一团糟:

我收到一条错误消息,提示“运行时错误 '-2147189176(80047e48):登录失败。详细信息:01000:[Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionOpen (Connect())”

因为报告是在不同的系统、不同的数据库上设计的,所以在调用报告之前有一个循环会重置每个表的数据库信息:

ConnectBufferString 读取“连接字符串=DRIVER=SQL Server;;用户 ID=用户;;密码=;;数据库=MY_DB;;服务器=192.168.1.3\SQLEXPRESS;;UseDSNProperties=-1”

似乎没有办法将提供程序显式设置为 SQLNCLI,至少我没有看到任何内容。

在我的开发系统上运行软件时,一切都按预期运行。

我希望你们能帮我解决这个问题。这样我们就不必为此争论了:我也认为这两种技术(vb6 和 cr9)都已经过时了,但是在这里切换不是一种选择。