把位图写入数据库的时候出错:
代码如下
_bstr_t sql;
CString a;
a.Format("SELECT * FROM Employees WHERE Emp_Id='%d'",iEmpId);
//执行SELECT语句
sql=a;
_RecordsetPtr m_pRecord;
m_pRecord=m_ADOconn.GetRecordSet(sql);
//要明白下面的思路,把位图图象读入数据库中去
VARIANT varBLOB;
SAFEARRAY *pas;//定义一个数组
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound=0;
rgsabound[0].cElements=m_filelen;
pas=SafeArrayCreate(VT_UI1,1,rgsabound);
for(long i=0;i<(long)m_filelen;i++)
SafeArrayPutElement(pas,&i,m_pBuffer++);
varBLOB.vt=VT_ARRAY|VT_UI1;
varBLOB.parray=pas;
//调用AppendChunk()函数将图象写入数据库
m_pRecord->GetFields()->GetItem("Photo")->AppendChunk(varBLOB);
//更新数据库
m_pRecord->Update();
请给与解释!!!
代码如下
_bstr_t sql;
CString a;
a.Format("SELECT * FROM Employees WHERE Emp_Id='%d'",iEmpId);
//执行SELECT语句
sql=a;
_RecordsetPtr m_pRecord;
m_pRecord=m_ADOconn.GetRecordSet(sql);
//要明白下面的思路,把位图图象读入数据库中去
VARIANT varBLOB;
SAFEARRAY *pas;//定义一个数组
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound=0;
rgsabound[0].cElements=m_filelen;
pas=SafeArrayCreate(VT_UI1,1,rgsabound);
for(long i=0;i<(long)m_filelen;i++)
SafeArrayPutElement(pas,&i,m_pBuffer++);
varBLOB.vt=VT_ARRAY|VT_UI1;
varBLOB.parray=pas;
//调用AppendChunk()函数将图象写入数据库
m_pRecord->GetFields()->GetItem("Photo")->AppendChunk(varBLOB);
//更新数据库
m_pRecord->Update();
请给与解释!!!
解决方案 »
- WM_WINDOWPOSCHANGING消息在什么情况之下被发出呢?
- 关于tab的句柄的一个问题
- 能不能自己写个打印设置对话框呢?也有纸张设置,边距、对齐等等参数设置
- 属性页问题
- 如何动态禁用对话框元素
- 如何得到网络程序的socket信息
- 我已经做好一个单文档程序,现在要把它改为多文档的,请问需要改那些地方?谢谢先
- 菜鸟
- ODBC问题
- (急)Shell问题:
- 如何在 ActiveX的编辑状态下, 双击ActiveX控件, 就可以调出 属性页?
- 大虾们,帮忙看看为什么在VC++中用ADO写ORCALE数据库时出问题啊,读可以,一写就跳出了(m_pRecordset->AddNew())这个语句错误
这句m_pRecord->GetFields()->GetItem("Photo")->AppendChunk(varBLOB);运行到AppendChunk就报错。
等待高手解答啊!
void CUploadPicDlg::OnButton2()
{
// TODO: Add your control notification handler code here
_CommandPtr Cmd1;
ParametersPtr *Params1 = NULL; // Not an instance of a smart pointer.
_ParameterPtr Param1;
_RecordsetPtr Rs1;
//try
// Create Parameter Object
//定义文件
CFile f("c:\\aaa.jpg",CFile::modeRead);
char bVal[100000];//定义长度为100k
UINT uIsRead=0;//已经读取 //定义变量
VARIANT varChunk;
SAFEARRAY *psa;//一个封装数组的东西的指针
SAFEARRAYBOUND rgsabound[1];//一个结构体
//创建SafeArray描述符:
uIsRead=f.Read(bVal,100000);// f.Close();//关文件 rgsabound[0].cElements =uIsRead;
rgsabound[0].lLbound = 0;
psa = SafeArrayCreate(VT_UI1,1,rgsabound);//建立SAFEARRAY //放置数据元素到SafeArray:
for(long index=0;index<uIsRead;index++)
{
if(FAILED(SafeArrayPutElement(psa,&index,&bVal[index])))
::MessageBox(NULL,"出毛病了。","提示",MB_OK | MB_ICONWARNING);
}
//一个一个地放,挺麻烦的。
//封装到VARIANT内:
varChunk.vt = VT_ARRAY|VT_UI1;
varChunk.parray = psa;
// Create Command Object
Cmd1.CreateInstance( __uuidof( Command ) );
Cmd1->ActiveConnection = m_CADODB.GetActiveConnection();
Cmd1->CommandText = _bstr_t("testdatebase ?"); Param1 = Cmd1->CreateParameter( _bstr_t(""),
adVarBinary,
adParamInput,
-1,
varChunk);
Param1->Value = varChunk;
Cmd1->Parameters->Append( Param1 );
Rs1 = Cmd1->Execute(NULL,NULL,NULL);
//取得文件大小
CFile f2;
f2.Open("c:\\bbb.jpg",CFile::modeWrite|CFile::modeCreate);//建立文件
long lPhotoSize = Rs1->Fields->Item["pic"]->ActualSize;
long lIsRead=0;
_variant_t varChunk2;
BYTE buf[100000];
while(lPhotoSize>0)
{
lIsRead=lPhotoSize;
varChunk2 = Rs1->Fields->Item["pic"]->GetChunk(lIsRead);
for(long index=0;index<lIsRead;index++)
{
::SafeArrayGetElement(varChunk2.parray,&index,buf+index);
}
f2.Write(buf,lIsRead);
lPhotoSize-=lIsRead;
}
f2.Close();
}
BOOL CADORecordset::AppendChunk(FieldPtr pField, LPVOID lpData, UINT nBytes)
{
HRESULT hr;
_variant_t varChunk;
long lngOffset = 0;
UCHAR chData;
SAFEARRAY FAR *psa = NULL;
SAFEARRAYBOUND rgsabound[1]; try
{
// Create a safe array to store the array of BYTES
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = nBytes;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound); while (lngOffset < (long)nBytes)
{
chData = ((UCHAR*)lpData)[lngOffset];
hr = SafeArrayPutElement(psa, &lngOffset, &chData); if (FAILED(hr)) return FALSE;
lngOffset++;
}
lngOffset = 0; // Assign the Safe array to a variant.
varChunk.vt = VT_ARRAY|VT_UI1;
varChunk.parray = psa; hr = pField->AppendChunk(varChunk); if (SUCCEEDED(hr)) return TRUE;
}
catch (_com_error &e)
{
dump_com_error(e);
return FALSE;
} return FALSE;
}调用
UINT nRet = 0;
CADORecordset adoSetImage;
CADOFieldInfo *fldinfo = new CADOFieldInfo; CFile file;
BYTE *data;
long size; if (!file.Open(m_strFile, CFile::modeRead|CFile::typeBinary))
{
MessageBox("读取图象数据失败!", "信息...", MB_OK|MB_ICONERROR);
nRet = 1;
}
else
{
adoSetImage = CADORecordset(m_pChildFrame->m_pAdoCon);
if (adoSetImage.Open("ADmain..RECimage"))
{
size = 1024;
adoSetImage.AddNew();
data = new BYTE[size + 1];
adoSetImage.SetFieldValue("prj_id", atol(m_strPrjRecNo));
adoSetImage.SetFieldValue("room_id", atol(m_strRecNo));
DWORD dwLength = file.GetLength();
while (file.Read(data, size))
{
adoSetImage.AppendChunk("f_image", (LPVOID)data, size);
dwLength -= (DWORD)size;
if (dwLength < (DWORD)size) size = (UINT)dwLength;
}
adoSetImage.Update(); delete data;
}
else
{
MessageBox(adoSetImage.GetLastErrorStr(), "信息...", MB_OK|MB_ICONERROR);
nRet = 1;
}
} delete fldinfo;