我要将一些short型一起作为二进制数据写入access数据库,程序如下所示,但SafeArray的VT只有用VT_UI1可以运行。但是msdn所说,VT_I2才是二字节int型吗,所以我需要用VT_I2,用VT_I2就会运行时出错(是到AppendChunk那一句)。不知道是哪里有问题?试了两天了,实在是不明白,哪位大侠指点一下,谢谢!!!
short *pBuf =new short[100];
VARIANT varBLOB;
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];
......(连接数据库的一些代码,ADO)
m_pRecordset->AddNew();
m_pRecordset->PutCollect("HouseNo",_variant_t("88"));
if(pBuf)
{
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = m_nFileLen;
//psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
psa = SafeArrayCreate(VT_I2, 1, rgsabound);
for (long i = 0; i < (long)m_nFileLen; i++)
{ //SafeArrayPutElement (psa, &i, pBuf++);
SafeArrayPutElement (psa, &i, pBuf+2);
}
//varBLOB.vt = VT_ARRAY | VT_UI1;
varBLOB.vt = VT_ARRAY | VT_I2;
varBLOB.parray = psa;
m_pRecordset->GetFields()->GetItem("TemperatureSet")->AppendChunk(varBLOB);
}
short *pBuf =new short[100];
VARIANT varBLOB;
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];
......(连接数据库的一些代码,ADO)
m_pRecordset->AddNew();
m_pRecordset->PutCollect("HouseNo",_variant_t("88"));
if(pBuf)
{
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = m_nFileLen;
//psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
psa = SafeArrayCreate(VT_I2, 1, rgsabound);
for (long i = 0; i < (long)m_nFileLen; i++)
{ //SafeArrayPutElement (psa, &i, pBuf++);
SafeArrayPutElement (psa, &i, pBuf+2);
}
//varBLOB.vt = VT_ARRAY | VT_UI1;
varBLOB.vt = VT_ARRAY | VT_I2;
varBLOB.parray = psa;
m_pRecordset->GetFields()->GetItem("TemperatureSet")->AppendChunk(varBLOB);
}
pBuf是short型的指针
它++一下就是移动了两个字节
无需你的干预
不过那段程序还是不行,我也试过,只是把VT_UI1替换成VT_U2,其余都不改,还是一运行就“Rumtime Error”,拜托帮我看看,还可能有别的地方出问题吗?
Represents the bounds of one dimension of the array. The lower bound of the dimension is represented by lLbound, and cElements represents the number of elements in the dimension. The structure is defined as follows:cElements不是以字节为单位的
这一句是有的,我没有贴出来而已。
还有就是cElements我觉得是count of Elements?我程序里是9个short型,一共18字节。unsigned m_nFileLen = file.GetLength()/2;已经考虑到这个问题了。
谢谢ChinaMo,不过问题还是存在啊,真的不明白了,
这里我改一下short *pBuf =new short[m_nFileLen];
VARIANT varBLOB;
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];
......(连接数据库的一些代码,ADO)
m_pRecordset->AddNew();
m_pRecordset->PutCollect("HouseNo",_variant_t("88"));
if(pBuf)
{
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = m_nFileLen;
//psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
psa = SafeArrayCreate(VT_I2, 1, rgsabound);
//........如果真不行,可能ADO就是要VT_UI1才行的,把short改char一下不就行了
这个问题实在是有点邪门,呜呜