可以参照:http://expert.csdn.net/Expert/topic/1512/1512389.xml?temp=.8389856转发我以前的回答这属于BLOB对象的插入,我使用的是用OLEDB的方法插入,很简单,在我的表中有2个字段,其中一个是文件名,另外一个是图片(image )。代码如下,代码可以用VC 的 ALT Wizard 生成,稍微做了些修改。第一步,首先生成绑定类,// TestPic.H : Declaration of the CTestPic class#ifndef __TESTPIC_H_ #define __TESTPIC_H_ class CTestPicAccessor { public: LONG m_imgId; TCHAR m_FileName[41]; ULONG m_FileNameSta; ULONG m_FileNameLen; ULONG m_PictureSta; ULONG m_PictureLen; ISequentialStream* m_Picture;BEGIN_COLUMN_MAP(CTestPicAccessor) // COLUMN_ENTRY(1, m_imgId) COLUMN_ENTRY_LENGTH_STATUS(1, m_FileName,m_FileNameLen,m_FileNameSta) BLOB_ENTRY_LENGTH_STATUS(2, IID_ISequentialStream, STGM_READ, m_Picture,m_PictureLen,m_PictureSta) END_COLUMN_MAP()DEFINE_COMMAND(CTestPicAccessor, _T(" \ SELECT \ FileName, \ Picture \ FROM dbo.TestPic")) // You may wish to call this function if you are inserting a record and wish to // initialize all the fields, if you are not going to explicitly set all of them. void ClearRecord() { memset(this, 0, sizeof(*this)); } };class CTestPic : public CCommand<CAccessor<CTestPicAccessor> > { public: HRESULT Open() { HRESULT hr; hr = OpenDataSource(); if (FAILED(hr)) return hr; return OpenRowset(); } HRESULT OpenDataSource() { HRESULT hr; CDataSource db; CDBPropSet dbinit(DBPROPSET_DBINIT); dbinit.AddProperty(DBPROP_AUTH_PASSWORD, OLESTR("sqlpassword")); dbinit.AddProperty(DBPROP_AUTH_USERID, OLESTR("sa")); dbinit.AddProperty(DBPROP_INIT_CATALOG, OLESTR("QSPDA")); dbinit.AddProperty(DBPROP_INIT_DATASOURCE, OLESTR("MyServer")); dbinit.AddProperty(DBPROP_INIT_LCID, (long)2052); dbinit.AddProperty(DBPROP_INIT_PROMPT, (short)4); hr = db.Open(_T("SQLOLEDB.1"), &dbinit); if (FAILED(hr)) return hr; return m_session.Open(db); } HRESULT OpenRowset() { // Set properties for open CDBPropSet propset(DBPROPSET_ROWSET); propset.AddProperty(DBPROP_IRowsetChange, true); propset.AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE); // propset.AddProperty(DBPROP_CANFETCHBACKWARDS, true);
#define __TESTPIC_H_
class CTestPicAccessor
{
public:
LONG m_imgId;
TCHAR m_FileName[41];
ULONG m_FileNameSta;
ULONG m_FileNameLen;
ULONG m_PictureSta;
ULONG m_PictureLen;
ISequentialStream* m_Picture;BEGIN_COLUMN_MAP(CTestPicAccessor)
// COLUMN_ENTRY(1, m_imgId)
COLUMN_ENTRY_LENGTH_STATUS(1, m_FileName,m_FileNameLen,m_FileNameSta)
BLOB_ENTRY_LENGTH_STATUS(2, IID_ISequentialStream, STGM_READ, m_Picture,m_PictureLen,m_PictureSta)
END_COLUMN_MAP()DEFINE_COMMAND(CTestPicAccessor, _T(" \
SELECT \
FileName, \
Picture \
FROM dbo.TestPic")) // You may wish to call this function if you are inserting a record and wish to
// initialize all the fields, if you are not going to explicitly set all of them.
void ClearRecord()
{
memset(this, 0, sizeof(*this));
}
};class CTestPic : public CCommand<CAccessor<CTestPicAccessor> >
{
public:
HRESULT Open()
{
HRESULT hr; hr = OpenDataSource();
if (FAILED(hr))
return hr; return OpenRowset();
}
HRESULT OpenDataSource()
{
HRESULT hr;
CDataSource db;
CDBPropSet dbinit(DBPROPSET_DBINIT); dbinit.AddProperty(DBPROP_AUTH_PASSWORD, OLESTR("sqlpassword"));
dbinit.AddProperty(DBPROP_AUTH_USERID, OLESTR("sa"));
dbinit.AddProperty(DBPROP_INIT_CATALOG, OLESTR("QSPDA"));
dbinit.AddProperty(DBPROP_INIT_DATASOURCE, OLESTR("MyServer"));
dbinit.AddProperty(DBPROP_INIT_LCID, (long)2052);
dbinit.AddProperty(DBPROP_INIT_PROMPT, (short)4);
hr = db.Open(_T("SQLOLEDB.1"), &dbinit);
if (FAILED(hr))
return hr; return m_session.Open(db);
}
HRESULT OpenRowset()
{
// Set properties for open
CDBPropSet propset(DBPROPSET_ROWSET);
propset.AddProperty(DBPROP_IRowsetChange, true);
propset.AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE);
// propset.AddProperty(DBPROP_CANFETCHBACKWARDS, true);
ClearRecord();
return CCommand<CAccessor<CTestPicAccessor> >::Open(m_session, NULL, &propset);
}
CSession m_session;
};#endif // __TESTPIC_H_第二步:下边的例子演示了如何使用这个绑定类void CInsertPhotoDlg::OnButton1()
{
CTestPic pic;
HRESULT hr = pic.Open(); CFile file;
CFileFind find;
BOOL bFind = find.FindFile("E:\\mosell\\MobileSales\\DOC\\TestPhoho\\*.jpg");
CString strFileName;
while(bFind)
{
bFind = find.FindNextFile();
// hr = pic.MoveFirst(); if(file.Open(find.GetFilePath(),CFile::modeRead)==TRUE)
{
UINT nBuffLen = file.GetLength();
ULONG nWritten;
CSeqStream *pPicStream = new CSeqStream;
BYTE *pBuff = (BYTE*)pPicStream->AllocBuff(nBuffLen);
UINT uCount = file.Read(pBuff,nBuffLen);
ASSERT(uCount == nBuffLen);
strFileName = find.GetFileName();
lstrcpyn(pic.m_FileName,find.GetFileName(),41);
pic.m_FileNameSta = DBSTATUS_S_OK;
pic.m_FileNameLen = strFileName.GetLength();
pic.m_Picture = pPicStream;
pic.m_PictureSta = DBSTATUS_S_OK;
pic.m_PictureLen = nWritten;
hr = pic.Insert(); ASSERT(nBuffLen == uCount); file.Close();
}
}
find.Close();}这个方法是我加上去的。CSeqStream 类你可以在MSND的代码示例中找到,我就不浪费空间了。
void* CSeqStream::AllocBuff(ULONG cbSize)
{
Clear();
m_cBufSize = cbSize;
m_pBuffer = CoTaskMemAlloc(m_cBufSize);
memset(m_pBuffer,0,m_cBufSize);
return m_pBuffer;
}