C++ OLE DB大容量复制操作始终将True加载到位列中

C++ OLE DB大容量复制操作始终将True加载到位列中,c++,sql-server,database,oledb,C++,Sql Server,Database,Oledb,我正在对SQL Server数据库使用OLE DB大容量复制操作,但在将数据加载到bit列时遇到问题-它们总是填充true 我用下面调整过的代码片段创建了一个from。我的程序包含一个创建目标表的小SQL脚本。我必须下载并安装x64版本的来构建它 // Set up custom bindings. oneBinding.dwPart = DBPART_VALUE | DBPART_LENGTH | DBPART_STATUS; oneBinding.iOrdinal = 1

我正在对SQL Server数据库使用OLE DB大容量复制操作,但在将数据加载到
bit
列时遇到问题-它们总是填充
true

我用下面调整过的代码片段创建了一个from。我的程序包含一个创建目标表的小SQL脚本。我必须下载并安装x64版本的来构建它

// Set up custom bindings.  
    oneBinding.dwPart = DBPART_VALUE | DBPART_LENGTH | DBPART_STATUS;
    oneBinding.iOrdinal = 1;
    oneBinding.pTypeInfo = NULL;
    oneBinding.obValue = ulOffset + offsetof(COLUMNDATA, bData);
    oneBinding.obLength = ulOffset + offsetof(COLUMNDATA, dwLength);
    oneBinding.obStatus = ulOffset + offsetof(COLUMNDATA, dwStatus);
    oneBinding.cbMaxLen = 1;   // Size of varchar column.  
    oneBinding.pTypeInfo = NULL;
    oneBinding.pObject = NULL;
    oneBinding.pBindExt = NULL;
    oneBinding.dwFlags = 0;
    oneBinding.eParamIO = DBPARAMIO_NOTPARAM;
    oneBinding.dwMemOwner = DBMEMOWNER_CLIENTOWNED;
    oneBinding.bPrecision = 0;
    oneBinding.bScale = 0;
    oneBinding.wType = DBTYPE_BOOL;
    ulOffset = oneBinding.cbMaxLen + offsetof(COLUMNDATA, bData);
    ulOffset = ROUND_UP(ulOffset, COLUMN_ALIGNVAL);

    if (FAILED(hr =
        pIFastLoad->QueryInterface(IID_IAccessor, (void**)&pIAccessor)))
        return hr;

    if (FAILED(hr = pIAccessor->CreateAccessor(DBACCESSOR_ROWDATA,
        1,
        &oneBinding,
        ulOffset,
        &hAccessor,
        &oneStatus)))
        return hr;

    // Set up memory buffer.  
    pData = new BYTE[40];
    if (!(pData /* = new BYTE[40]*/)) {
        hr = E_FAIL;
        goto cleanup;
    }

    pcolData = (COLUMNDATA*)pData;
    pcolData->dwLength = 1;
    pcolData->dwStatus = 0;

    for (i = 0; i < 10; i++)
    {
        if (i % 2 == 0)
        {
            pcolData->bData[0] = 0x00;
        }
        else
        {
            pcolData->bData[0] = 0xFF;
        }


        if (FAILED(hr = pIFastLoad->InsertRow(hAccessor, pData)))
            goto cleanup;
    }
//设置自定义绑定。
oneBinding.dwPart=DBPART_值| DBPART_长度| DBPART_状态;
oneBinding.iOrdinal=1;
oneBinding.pTypeInfo=NULL;
oneBinding.obValue=ulOffset+offsetof(COLUMNDATA,bData);
oneBinding.obLength=ulOffset+offsetof(COLUMNDATA,dwLength);
oneBinding.obStatus=ulOffset+offsetof(COLUMNDATA,dwStatus);
oneBinding.cbMaxLen=1;//varchar列的大小。
oneBinding.pTypeInfo=NULL;
oneBinding.pObject=NULL;
oneBinding.pBindExt=NULL;
oneBinding.dwFlags=0;
oneBinding.eParamIO=DBPARAMIO_NOTPARAM;
oneBinding.dwMemOwner=DBMEMOWNER\u CLIENTOWNED;
oneBinding.bPrecision=0;
oneBinding.bScale=0;
oneBinding.wType=DBTYPE\u BOOL;
ulOffset=oneBinding.cbMaxLen+offsetof(COLUMNDATA,bData);
ulOffset=向上取整(ulOffset,COLUMN\u ALIGNVAL);
如果失败(hr=
pIFastLoad->QueryInterface(IID_IAccessor,(void**)和pIAccessor)))
返回人力资源;
如果(失败)(hr=pIAccessor->CreateAccessor(DBACCESSOR_ROWDATA),
1.
&一元化,
ulOffset,
&hAccessor,
&(一个身份)
返回人力资源;
//设置内存缓冲区。
pData=新字节[40];
如果(!(pData/*=新字节[40]*/){
hr=E_失败;
去清理;
}
pcolData=(COLUMNDATA*)pData;
pcolData->dwLength=1;
pcolData->dwStatus=0;
对于(i=0;i<10;i++)
{
如果(i%2==0)
{
pcolData->bData[0]=0x00;
}
其他的
{
pcolData->bData[0]=0xFF;
}
if(失败(hr=pIFastLoad->InsertRow(hAccessor,pData)))
去清理;
}

很可能我在缓冲区中输入了错误的值,或者其他常量值不正确。我确实发现描述各种数据类型转换的安全性,看起来从字节到布尔是安全的。。。但是如果只是一个字节数组,缓冲区怎么知道我在放什么样的数据呢?

弄明白了这一点,我没有正确地将演示从加载字符串切换到固定宽度值。对于字符串,数据blob获取指向该值的1宽度指针,而固定宽度值获取实际数据

因此,我的
COLUMNDATA
struct现在看起来如下所示:

// How to lay out each column in memory.  
struct COLUMNDATA {
    DBLENGTH dwLength;   // Length of data (not space allocated).  
    DWORD dwStatus;   // Status of column.  
    VARIANT_BOOL bData; // Value, or if a string, a pointer to the value.
};
for (i = 0; i < 10; i++)
{
    if (i % 2 == 0)
    {
        pcolData->bData = VARIANT_TRUE;
    }
    else
    {
        pcolData->bData = VARIANT_FALSE;
    }

    if (FAILED(hr = pIFastLoad->InsertRow(hAccessor, pData)))
        goto cleanup;
}
使用此处的相关长度固定:

pcolData = (COLUMNDATA*)pData;
pcolData->dwLength = sizeof(VARIANT_BOOL); // using a short.. make it two
pcolData->dwStatus = DBSTATUS_S_OK; // Indicates that the data value is to be used, not null
循环的小值设置如下所示:

// How to lay out each column in memory.  
struct COLUMNDATA {
    DBLENGTH dwLength;   // Length of data (not space allocated).  
    DWORD dwStatus;   // Status of column.  
    VARIANT_BOOL bData; // Value, or if a string, a pointer to the value.
};
for (i = 0; i < 10; i++)
{
    if (i % 2 == 0)
    {
        pcolData->bData = VARIANT_TRUE;
    }
    else
    {
        pcolData->bData = VARIANT_FALSE;
    }

    if (FAILED(hr = pIFastLoad->InsertRow(hAccessor, pData)))
        goto cleanup;
}
(i=0;i<10;i++)的

{
如果(i%2==0)
{
pcolData->bData=VARIANT\u TRUE;
}
其他的
{
pcolData->bData=VARIANT\u FALSE;
}
if(失败(hr=pIFastLoad->InsertRow(hAccessor,pData)))
去清理;
}

我已经用工作代码更新了。在阅读了
obValue
属性的后,我受到了这个改变的启发。

发现了这个问题,我没有正确地将演示从加载字符串切换到固定宽度值。对于字符串,数据blob获取指向该值的1宽度指针,而固定宽度值获取实际数据

因此,我的
COLUMNDATA
struct现在看起来如下所示:

// How to lay out each column in memory.  
struct COLUMNDATA {
    DBLENGTH dwLength;   // Length of data (not space allocated).  
    DWORD dwStatus;   // Status of column.  
    VARIANT_BOOL bData; // Value, or if a string, a pointer to the value.
};
for (i = 0; i < 10; i++)
{
    if (i % 2 == 0)
    {
        pcolData->bData = VARIANT_TRUE;
    }
    else
    {
        pcolData->bData = VARIANT_FALSE;
    }

    if (FAILED(hr = pIFastLoad->InsertRow(hAccessor, pData)))
        goto cleanup;
}
使用此处的相关长度固定:

pcolData = (COLUMNDATA*)pData;
pcolData->dwLength = sizeof(VARIANT_BOOL); // using a short.. make it two
pcolData->dwStatus = DBSTATUS_S_OK; // Indicates that the data value is to be used, not null
循环的小值设置如下所示:

// How to lay out each column in memory.  
struct COLUMNDATA {
    DBLENGTH dwLength;   // Length of data (not space allocated).  
    DWORD dwStatus;   // Status of column.  
    VARIANT_BOOL bData; // Value, or if a string, a pointer to the value.
};
for (i = 0; i < 10; i++)
{
    if (i % 2 == 0)
    {
        pcolData->bData = VARIANT_TRUE;
    }
    else
    {
        pcolData->bData = VARIANT_FALSE;
    }

    if (FAILED(hr = pIFastLoad->InsertRow(hAccessor, pData)))
        goto cleanup;
}
(i=0;i<10;i++)的

{
如果(i%2==0)
{
pcolData->bData=VARIANT\u TRUE;
}
其他的
{
pcolData->bData=VARIANT\u FALSE;
}
if(失败(hr=pIFastLoad->InsertRow(hAccessor,pData)))
去清理;
}

我已经用工作代码更新了。在阅读了有关
obValue
属性的说明后,我受到了做出此更改的启发。

我想您需要
oneBinding.cbMaxLen=sizeof(VARIANT\u BOOL)
。我想您需要
oneBinding.cbMaxLen=sizeof(VARIANT\u BOOL)