是否有任何通用解决方案可以在不使用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状态还有其他任何方法吗?
答案 0 :(得分:2)
由于没有其他人尝试任何答案我会给你这个:
我不相信有一个符合您要求的解决方案,但我认为您认为合理的要求可能是错误的。
这里要清楚我们正在讨论SQL_GETDATA_EXTENSIONS的SQLGetInfo驱动程序回复,它指定是否可以使用SQLGetData乱序检索列,除了绑定与否,正如您所说的MS SQL Server ODBC驱动程序没有允许乱序,不允许绑定列。
围绕ODBC,各种语言都有很多包装器,其中许多都遇到了同样的问题。如果您同意2件事情,问题就会消失1)应用程序不应该选择它不打算读取的数据2)应用程序应该指定它想要多少长列数据以及截断该数据是否正常。一旦您同意,您就可以阅读至少一些数据。
例如,在Perl中,DBI具有LongReadlen和LongTrunkOk,前者指定从长列读取的最大数据量,后者表示截断是否允许。如果你使用ODBC包装器查看其他语言,他们几乎都会做同样的事情。
很抱歉,如果这不是您要找的答案。