OLE DB 提供程序将 SQLVARIANT 列中的 DATE 值返回为 BSTR

问题描述

我有一个特殊的表,我在其中记录了 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_DATEVT_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 也会发生同样的情况

  • 我认为无法将 sql_VARIANT 绑定为其他值作为 VARIANT。或者有什么不同的方法来绑定这个列?
  • 是否存在已知问题或已知错误
  • 我不想在使用强制转换时使查询变得复杂

编辑:同样适用于 TIME 类型的列。它们也作为 VT_BSTR

返回

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)