none
BLOB数据,关闭命令时怎么出现访问冲突呢? RRS feed

  • 问题

  • //

    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;
    }

    // 上边代码,怎么

    2011年10月8日 14:23

答案

全部回复