如题!
插入如代码段如下:
如果把其字段改为image类型则可正常插入,但用binary类型是插入报错:
在此环境中不允许操作 Unknown error 0x800A0C93
望各位帮个忙!!
try
{
memcpy(buf,"just a test buffer data",len);
TESTHR(m_connection.CreateInstance(__uuidof(Connection)));
m_connection->ConnectionTimeout = 10;
m_connection->Open(_bstr_t(connstr), "", "", NULL);
TESTHR(m_recordset.CreateInstance(__uuidof(Recordset)));
m_recordset->Open(
"select * from tmptab",
_variant_t((IDispatch*)m_connection,true),
adOpenStatic,
adLockOptimistic,
adCmdText);
m_recordset->AddNew();
if (buf == NULL)
return false;
_variant_t varBlob;
SAFEARRAY* psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = len;
psa = ::SafeArrayCreate(VT_UI1, 1, rgsabound);
for (long i=0; i < len; i++)
::SafeArrayPutElement(psa, &i, buf++);
varBlob.vt = VT_ARRAY | VT_UI1;
varBlob.parray = psa;
TESTHR(m_recordset->GetFields()->GetItem("txt")->AppendChunk(varBlob));
m_recordset->Update();
}
catch(::_com_error& e)
{
printf("error:%s\n%s\n", (const char*)e.Description(), e.ErrorMessage());
if (ptmp != NULL)
delete[] ptmp;
return false;
}
插入如代码段如下:
如果把其字段改为image类型则可正常插入,但用binary类型是插入报错:
在此环境中不允许操作 Unknown error 0x800A0C93
望各位帮个忙!!
try
{
memcpy(buf,"just a test buffer data",len);
TESTHR(m_connection.CreateInstance(__uuidof(Connection)));
m_connection->ConnectionTimeout = 10;
m_connection->Open(_bstr_t(connstr), "", "", NULL);
TESTHR(m_recordset.CreateInstance(__uuidof(Recordset)));
m_recordset->Open(
"select * from tmptab",
_variant_t((IDispatch*)m_connection,true),
adOpenStatic,
adLockOptimistic,
adCmdText);
m_recordset->AddNew();
if (buf == NULL)
return false;
_variant_t varBlob;
SAFEARRAY* psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = len;
psa = ::SafeArrayCreate(VT_UI1, 1, rgsabound);
for (long i=0; i < len; i++)
::SafeArrayPutElement(psa, &i, buf++);
varBlob.vt = VT_ARRAY | VT_UI1;
varBlob.parray = psa;
TESTHR(m_recordset->GetFields()->GetItem("txt")->AppendChunk(varBlob));
m_recordset->Update();
}
catch(::_com_error& e)
{
printf("error:%s\n%s\n", (const char*)e.Description(), e.ErrorMessage());
if (ptmp != NULL)
delete[] ptmp;
return false;
}
解决方案 »
- MFC控件问题
- RPC编程,注册接口函数RpcServerRegisterIfEx中的第四个参数问题
- 如何取消工具条按钮的选中状态
- 如何取得文件夹的创建时间? 我的代码怎么不行呢?
- 急用~~CSocket类怎么获取远程IP和端口啊~?
- 100分求下一步载地址
- 关于CAsyncSocket的一个问题,在线!!!!!!!!!!!
- 难道真的没有高手?
- 为什么没他妈的人回答,也不难呀
- 我刚来此处,那位大哥告诉我怎样在CSDN上发布共享软件?
- SHGetPathFromIDList 在VSITA下的BUG问题
- ** 难题: A网页有一部分数据, A网页请求我的MFC函数显示一个网页B来显示其中一条记录, 网页B点击一个按钮后, A网页如何感知?
我传一个结构体或者数组给存储过程 存储过程把它存到数据库 是binary类型的 这个我搞定了直接改为char*可存可是我提取是用结果集来提取的 我想问用结果集提取binary是怎么弄》? 也是用的SAFEARRAYBOUND 这种方法么?
我是用存储过程的
我的Info.base是一个结构体_ParameterPtr m_pParamBase
m_pParamBase.CreateInstance(__uuidof(Command));m_pParamBase = m_pCommand->CreateParameter((_bstr_t)param.vInputParam[9],adBinary,adParamInput,param.vInputParamLength[9],(_variant_t)(char*)&Info.base);//给参数设置各属性
m_pCommand->Parameters->Append(m_pParamBase);//加入到Command对象的参数集属性中
m_command->PutCommandType(adCmdText);
m_recordset = m_command->Execute(NULL,NULL,adCmdUnknown);
...
while (!m_recordset->EndOfFile)
{
DataTypeEnum type = m_recordset->Fields->GetItem("字段")->Type;
_variant_t varValue = m_recordset->Fields->GetItem("字段")->Value;
switch(type)
{
case adBinary:
long nsize = m_recordset->Fields->GetItem("字段")->GetActualSize();
char* sBinary = new char[size];
char* pTmp = NULL;
_variant_t varBlob;
varBlob = varValue;
::SafeArrayAccessData(varBlob.parray,(void**)&pTmp);
for (int j=0; j<nSize; j++)
sBinary[j] = pTmp[j];
::SafeArrayUnaccessData(varBlob.parray);
sBinary中就是取到的数据了
....
}
}
m_pParamBase = m_pCommand->CreateParameter((_bstr_t)param.vInputParam[9],adBinary,adParamInput,param.vInputParamLength[9],(_variant_t)(char*)&Info.base);//给参数设置各属性
就是这一个 (_variant_t)(char*)&Info.base 我的Info.base是个结构体 我一把存的 转化为CHAR*再存 然后 adBinary 是这个 就行了可是 如果按结果集提取的那个方法 那代码量就太大了 我是在想 我用 pCommand来存 可以直接转化为
(_variant_t)(char*)&Info.base 这样来来存 那我提取binary的时候 应该可以直接转化为char*啊 而不是 通过SafeArrayAccessData来搞一大段的代码
DWORD m_nFileLen = size;
VARIANT varBLOB;
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];
if(pBuf)
{
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = m_nFileLen;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound); ///创建SAFEARRAY对象
for (long i = 0; i < (long)m_nFileLen; i++)
SafeArrayPutElement (psa, &i, pBuf++); ///将pBuf指向的二进制数据保存到SAFEARRAY对象psa中
varBLOB.vt = VT_ARRAY | VT_UI1; ///将varBLOB的类型设置为BYTE类型的数组
varBLOB.parray = psa; ///为varBLOB变量赋值
m_pRecordset->GetFields()->GetItem("Property")->AppendChunk(varBLOB);///加入BLOB类型的数据
} 这是我原来用的一段用结果集来存的代码 不过我也是存的IMAGE 你看看可不可以存binary 我太郁闷了 我就是想 用 pCommand来把数组和结构体存为binary 然后用结果集来提取把数据 还原到数组和机构体的变量。。
你这样存 就是把你的参数转化为char*直接存 绝对能存的进去的
//buf中为要存入的数据
std::stringstream sstr;
sstr << "insert into tmptab(txt) values (convert(binary,'" << buf << "'))"; TESTHR(m_connection.CreateInstance(__uuidof(Connection)));
m_connection->ConnectionTimeout = 10;
m_connection->Open(_bstr_t(connstr), "", "", NULL);
TESTHR(m_command.CreateInstance(__uuidof(Command)));
m_command->ActiveConnection = m_connection;
m_command->CommandText = sstr.str().c_str();
m_command->Execute(NULL,NULL,adCmdUnknown);
do
{
while(!m_recordset->EndOfFile)
{
for(i=0; i<列数; i++)
{
varparam = m_recordset-Fields->GetItem((long)i)->Value;//取每列的数据
//ToDo: 数据处理
}
m_recordset->MoveNext();//提取下一行
}
}while(m_recordset=m_recordset->NextRecordset((VARIANT*)lngRec));
//如果有多个结果集的话移到下一个结果集