获取未绑定列的指示符值而不调用SQLGetData()

时间:2014-04-14 15:12:07

标签: sql-server odbc

是否有任何通用解决方案可以在不使用NULL/NOTNULL的情况下从列中获取SQLBindCol()状态?

对于ODBC结果集中的BLOB / MEMO列,某些驱动程序对SQLGetData()函数提供有限的支持。例如:

  

如果有两个BLOB列3和4,则第3列中的数据必须为   在阅读之前完全阅读4.在阅读4之后,它是不可能的   阅读3.

因此,如果抽象层提供resultset.column(4).isnull()之类的内容,则isnull()实现必须使用SQLGetData()来检查SQL_NULL_DATA。但在此之后,有人不能使用resultset.column(3).read(buf) - 或类似的功能(好吧,你可以在SQLFetch()之后逐步读入所有blob / memo到缓冲区以避免任何问题但是这样的缓冲非常糟糕在抽象层内......)。

一种解决方案是通过SQLLEN将小缓冲区和SQLBindCol()值绑定为指示符。如果值(BLOB等)为null,SQLFetch()将在SQL_NULL_DATA指示符值中返回SQLLEN,而无需调用SQLGetData()

但是某些驱动程序(如Microsoft Native Client ODBC Driver)无法在有界列上使用SQLGetData()。因此,如果指标非NULL,则无法使用SQLGetData()读取数据。

MS文档说可以通过SQLBindCol绑定一个指示符指针并保留dataptr NULL。我试过这个没有成功。永远不会修改指示符(使用SQL_NULL_DATA初始化)。我已尝试手动为SQLSetDescField()设置指针指针(包括指示计数器等),但没有任何改变。似乎驱动程序仅在数据ptr可用时填充指标ptr。

列的get null / not null状态还有其他任何方法吗?

1 个答案:

答案 0 :(得分:2)

由于没有其他人尝试任何答案我会给你这个:

我不相信有一个符合您要求的解决方案,但我认为您认为合理的要求可能是错误的。

这里要清楚我们正在讨论SQL_GETDATA_EXTENSIONS的SQLGetInfo驱动程序回复,它指定是否可以使用SQLGetData乱序检索列,除了绑定与否,正如您所说的MS SQL Server ODBC驱动程序没有允许乱序,不允许绑定列。

围绕ODBC,各种语言都有很多包装器,其中许多都遇到了同样的问题。如果您同意2件事情,问题就会消失1)应用程序不应该选择它不打算读取的数据2)应用程序应该指定它想要多少长列数据以及截断该数据是否正常。一旦您同意,您就可以阅读至少一些数据。

例如,在Perl中,DBI具有LongReadlen和LongTrunkOk,前者指定从长列读取的最大数据量,后者表示截断是否允许。如果你使用ODBC包装器查看其他语言,他们几乎都会做同样的事情。

很抱歉,如果这不是您要找的答案。