怎样读写数据库中的图片 我现在想向数据库中读写图片,我该怎么样做? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ole 对象!我用的是access!来信[email protected]我发一个原码给你! 代码的内容是将c盘下的abc.doc文件存入表hycao中,注意相应字段的数据类型应为OLE 对象;最后再从数据库中将该文件读出,保存为c:\TempFile.doc:Dim adoConnection As New ADODB.ConnectionDim adoRecordset As New ADODB.RecordsetadoConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=C:\abc.mdb"adoRecordset.Open "SELECT * FROM hycao", adoConnection, adOpenKeyset, adLockOptimisticadoRecordset.AddNewDim adoStream As New ADODB.StreamadoStream.Type = adTypeBinaryadoStream.OpenadoStream.LoadFromFile "c:\abc.doc"'将二进制文件写入大字段:adoRecordset.Fields.Item(5).AppendChunk adoStream.ReadadoRecordset.Update'================================'从大字段读取二进制数据:Dim TempFileName As StringTempFileName = "c:\TempFile.doc"adoStream.Write adoRecordset.Fields.Item(5).GetChunk(adoRecordset.Fields.Item(5).ActualSize)adoStream.SaveToFile TempFileName, IIf(Len(Trim(Dir(TempFileName, vbNormal + vbHidden))) > 0, adSaveCreateOverWrite, adSaveCreateNotExist) www.vckbase.com上面有一个例程ADOBLOB,建议看看其中核心代码如下:///读取数据....long lDataSize = m_pRecordset->GetFields()->GetItem("photo")->ActualSize; if(lDataSize > 0) { _variant_t varBLOB; varBLOB = m_pRecordset->GetFields()->GetItem("photo")->GetChunk(lDataSize); if(varBLOB.vt == (VT_ARRAY | VT_UI1)) {///判断数据类型是否正确(BYTE类型的数组) if(m_pBMPBuffer = new char[lDataSize+1]) ///重新分配必要的存储空间 { char *pBuf = NULL; SafeArrayAccessData(varBLOB.parray,(void **)&pBuf); ///得到指向数据的指针 memcpy(m_pBMPBuffer,pBuf,lDataSize); ///复制数据到缓冲区m_pBMPBuffer SafeArrayUnaccessData (varBLOB.parray); m_nFileLen = lDataSize; m_hPhotoBitmap = BufferToHBITMAP(); ///生成BITMAP对象 } } }...../// 保存数据......char *pBuf = m_pBMPBuffer; 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("photo")->AppendChunk(varBLOB); ///加入BLOB类型的数据 } m_pRecordset->Update();...... 关于在vc中打开txt的问题 vs2005中找不到ado控件 在打印中为什么要添加这两句话??这两句话是什么意思谢谢!! mfc odbc访问access数据库 关于OpenService函数? 一个莫名其妙但困惑人的问题,向各位求解。。。 怎样在vc++中结束一个正在运行的程序(比如结束记事本程序的运行) 清华同方V4100C的本子有用过的吗?评价一下!(斑竹手下留情,两天就结) 怎么往数据库里写数据? 欲哭无泪。。。这是什么情况??? 有两个关于use case 的问题请教 picture控件里画波形
我用的是access!来信
[email protected]
我发一个原码给你!
Dim adoRecordset As New ADODB.Recordset
adoConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=C:\abc.mdb"
adoRecordset.Open "SELECT * FROM hycao", adoConnection, adOpenKeyset, adLockOptimistic
adoRecordset.AddNew
Dim adoStream As New ADODB.Stream
adoStream.Type = adTypeBinary
adoStream.Open
adoStream.LoadFromFile "c:\abc.doc"
'将二进制文件写入大字段:
adoRecordset.Fields.Item(5).AppendChunk adoStream.Read
adoRecordset.Update
'================================
'从大字段读取二进制数据:
Dim TempFileName As String
TempFileName = "c:\TempFile.doc"
adoStream.Write adoRecordset.Fields.Item(5).GetChunk(adoRecordset.Fields.Item(5).ActualSize)
adoStream.SaveToFile TempFileName, IIf(Len(Trim(Dir(TempFileName, vbNormal + vbHidden))) > 0, adSaveCreateOverWrite, adSaveCreateNotExist)
其中核心代码如下:
///读取数据
....
long lDataSize = m_pRecordset->GetFields()->GetItem("photo")->ActualSize;
if(lDataSize > 0)
{
_variant_t varBLOB;
varBLOB = m_pRecordset->GetFields()->GetItem("photo")->GetChunk(lDataSize);
if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{///判断数据类型是否正确(BYTE类型的数组)
if(m_pBMPBuffer = new char[lDataSize+1]) ///重新分配必要的存储空间
{
char *pBuf = NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf); ///得到指向数据的指针
memcpy(m_pBMPBuffer,pBuf,lDataSize); ///复制数据到缓冲区m_pBMPBuffer
SafeArrayUnaccessData (varBLOB.parray);
m_nFileLen = lDataSize;
m_hPhotoBitmap = BufferToHBITMAP(); ///生成BITMAP对象
}
}
}
.....
/// 保存数据
......
char *pBuf = m_pBMPBuffer;
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("photo")->AppendChunk(varBLOB);
///加入BLOB类型的数据
}
m_pRecordset->Update();
......