积极答复者
BLOB数据,关闭命令时怎么出现访问冲突呢?

问题
-
//
class CTestBlobAccessor
{
public:
LONG m_ID;
ISequentialStream* m_Picture;DBSTATUS m_dwIDStatus;
DBSTATUS m_dwPictureStatus;DBLENGTH m_dwIDLength;
DBLENGTH m_dwPictureLength;BEGIN_ACCESSOR_MAP(CTestBlobAccessor,2)
BEGIN_ACCESSOR(0,true)
COLUMN_ENTRY_LENGTH_STATUS(1,m_ID,m_dwIDLength,m_dwIDStatus)
END_ACCESSOR()BEGIN_ACCESSOR(1,false)
BLOB_ENTRY_LENGTH_STATUS(2,IID_ISequentialStream, STGM_READ,m_Picture,m_dwPictureLength,m_dwPictureStatus)
END_ACCESSOR()
END_ACCESSOR_MAP()
};
#include "stdafx.h"
#include "TestOle.h"#include "TestBlob.h"
#include "SeqStream.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 唯一的应用程序对象CWinApp theApp;
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;HMODULE hModule = ::GetModuleHandle(NULL);
CoInitialize(NULL);
if (hModule != NULL)
{
// 初始化 MFC 并在失败时显示错误
if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
{
// TODO: 更改错误代码以符合您的需要
_tprintf(_T("错误: MFC 初始化失败\n"));
nRetCode = 1;
}
else
{
// TODO: 在此处为应用程序的行为编写代码。
//IDataInitialize* pIDataInitialize = NULL;
//IDBInitialize* pIDBInitialize = NULL;
CDataSource ds;
CSession ss;CDBPropSet dbInit(DBPROPSET_DBINIT);
HRESULT hr=S_OK;
dbInit.AddProperty(DBPROP_AUTH_USERID, OLESTR("test"));
dbInit.AddProperty(DBPROP_AUTH_PASSWORD, OLESTR("password"));
dbInit.AddProperty(DBPROP_INIT_CATALOG, OLESTR("test"));
dbInit.AddProperty(DBPROP_INIT_DATASOURCE, OLESTR("(local)"));
if(S_OK==ds.Open(L"SQLOLEDB.1",&dbInit)){
if(S_OK==ss.Open(ds)){CCommand<CAccessor<CTestBlobAccessor> > myTable;
//CTable<CAccessor<CTestBlobAccessor> > myTable;
CDBPropSet propRowset(DBPROPSET_ROWSET);
propRowset.AddProperty(DBPROP_CANFETCHBACKWARDS, true);
propRowset.AddProperty(DBPROP_CANSCROLLBACKWARDS, true);
propRowset.AddProperty(DBPROP_ISequentialStream,true);
propRowset.AddProperty(DBPROP_IRowsetChange, true);
propRowset.AddProperty(DBPROP_UPDATABILITY,DBPROPVAL_UP_INSERT|DBPROPVAL_UP_CHANGE|DBPROPVAL_UP_DELETE);if(S_OK==myTable.Open(ss,_T("SELECT * FROM test.dbo.TestBlob"),&propRowset)){
//if(S_OK==myTable.Open(ss,_T("test.dbo.TestBlob"),&propRowset)){while(myTable.MoveNext()==S_OK){
wprintf(_T("--------- nID = %d ---------\n"),myTable.m_ID);
}
if(S_OK==myTable.MoveFirst()){
HRESULT hr=myTable.GetData(1);// 如果不要这个语句,后边关闭语句就不会出现访问冲突!
//hr=myTable.AddRefRows();
//hr=myTable.ReleaseRows();
CFileException fe;
CFile file;
file.Open(_T("E:\\MySelf\\Document\\Visual Studio 2010\\Projects\\TestPicture\\拾荒者.jpg"),CFile::modeRead,&fe);
ULONG cbLength=file.GetLength();
BYTE* buffer=new BYTE[cbLength];file.Read(buffer,cbLength);
file.Close();CSeqStream* pSeqStream=new CSeqStream();
ULONG cbWritten=0;
pSeqStream->Write(buffer,cbLength,&cbWritten);
TRACE("--------- %d byte write successful! ---------\n",cbWritten);pSeqStream->Seek(0);
delete[] buffer;
myTable.m_Picture->Release();
myTable.m_Picture=pSeqStream;
myTable.m_dwPictureLength=cbLength;
myTable.m_dwIDStatus=DBSTATUS_S_OK;
if(S_OK!=myTable.SetData(1)){
//pSeqStream->Release();
TRACE("--------- write to database successful! ---------\n");
}
}
if(myTable.m_spRowset!=NULL){
myTable.Close();// 这里出现访问冲突
}
}if(ss.m_spOpenRowset!=NULL)
ss.Close();
}
if(ds.m_spInit!=NULL)
ds.Close();
}
}
}
else
{
// TODO: 更改错误代码以符合您的需要
_tprintf(_T("错误: GetModuleHandle 失败\n"));
nRetCode = 1;
}CoUninitialize();
return nRetCode;
}// 上边代码,怎么