问题描述
我有一个特殊的表,我在其中记录了 sql_VARIANT
列中的一些值。
这很好用。这里简化了
CREATE TABLE [tbl] (
[IdColumn] [int] NOT NULL,[NewValue] [sql_variant] NULL,)
要阅读此表,我使用了我当前的 ATL OLE DB 内容,并且可以轻松地将此列绑定为 VARIANT。 对于 DATE 列。
这是对我的表的示例查询
SELECT [IdColumn],[NewValue],sql_VARIANT_PROPERTY([NewValue],'BaseType') FROM [tbl]
输出。有趣的列是5571
IdColumn NewValue BaseType
2 A - NULL nvarchar
5 Test nvarchar
6 Test nvarchar
2221 1858 int
2222 N001/04711 nvarchar
2224 10 float
2225 4803 int
5570 2021-04-03 12:00:00.000 datetime
5571 2021-03-02 00:00:00.000 date
5573 1 tinyint
5574 2 tinyint
5575 45 float
5576 15555 float
5577 2073 int
5578 99999 int
5579 4550 int
5580 9 int
5581 398 int
但该列并没有像我期望的那样绑定为 VT_DATE
或 VT_R8
。它由我的 OLE DB 提供程序以 yyy-mm-dd 形式作为 VT_BSTR
返回。
这里是读取表格的简单代码。
class CTestAccessor
{
public:
long m_lIdColumn;
VARIANT m_variant;
BEGIN_COLUMN_MAP(CTestAccessor)
COLUMN_ENTRY( 1,m_lIdColumn )
COLUMN_ENTRY( 2,m_variant )
END_COLUMN_MAP( )
};
void test()
{
// Determine the new date and time
// Get the connector and execute
CCommand<CAccessor<CTestAccessor> > cmd;
HRESULT hr = cmd.Open(CONNECTOR.GetDataConnection(),_T("Select IdColumn,NewValue FROM tbl"));
if (Failed(hr))
return;
while ((hr = cmd.MoveNext())==S_OK)
{
TRACE(_T(__FUNCTION__ _T(" %d - %d\n")),cmd.m_lIdColumn,cmd.m_variant.vt);
}
}
对应VT-类型的输出
Test 2 - 8
Test 5 - 8
Test 6 - 8
Test 2221 - 3
Test 2222 - 8
Test 2224 - 5
Test 2225 - 3
Test 5570 - 7
Test 5571 - 8
Test 5573 - 17
Test 5574 - 17
Test 5575 - 5
Test 5576 - 5
Test 5577 - 3
Test 5578 - 3
Test 5579 - 3
Test 5580 - 3
Test 5581 - 3
很容易看出,列 5571 是 DATE 类型,但返回为 VT_BSTR(8)。而定义为 DATETIME 的列 5570 返回为 VT_DATE(7)
使用的提供程序是 sqlNCLI11。使用提供程序 MSOLEDBsql.1 也会发生同样的情况
编辑:同样适用于 TIME
类型的列。它们也作为 VT_BSTR
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)