关于在Oracle,Access中存取BLOB型数据(讨论)

解决方案 »

  1.   

    我人为是个很值得讨论的问题,挂access很容易,
    可是一挂oracle,问题就出来了!郁闷郁闷!!
    AddNew用不起,而且AppendChunk也一用就内存报错!!!
    共同攻啊,共勉.
    我看过王骏的程序,可是他也没实验过挂oracle.可能是
    要改变很多地方
      

  2.   

    我换了驱动程序,
    换了oracle9的驱动还是用不起!!
      

  3.   

    to COOL099(Alan Zjou):
    你说的没有错,但是别人做的总是别人做的,不太灵活,我个人认为看别人的代码来学习,的确是一种不错的办法,但有局限性,别人的代码毕竟只是他(她)们写程序时用到的,但是没有用到的呢?to zhaoshuo2113(为四里):
    你说的问题我也遇到了,不过最近找到一个比较好的网站,碰碰运气,看有没有这方面的文章了是Oracle的官方网站
      

  4.   

    to 小古:
        哦,同事提示我上微软中国的网站,在BBS上有专家解答,你也可以去试一下有一位专家告诉我把Provider由microsoft OLE DB换成oracle for OLE DB Provider,就可以了,可是实验过了,没有用的 .
      

  5.   

    好像用Oracle的人不多呀。
    这么冷淡。郁闷++
      

  6.   

    一般的企业很少有用oracle的我也没用过支持一下up
      

  7.   

    好像听说过Oracle压进去再取出来会多几个字节
      

  8.   

    ZT    在用Visual C++编写应用程序时,常会遇到如何存取数据库中大对象的问题。大对象文档以二进制数据形式保存在BLOB类型的字段中,这些大对象可能是Word、Execl或图片文件等,目前多数数据库都支持BLOB类型的字段。     VC存取这些大对象数据有众多方法,如OLE、ActiveX等,事实上VC的MFC提供了一个很方便的实现方法,即利用MFC提供的CLongBinary类可以方便地实现存取BLOB字段。下面笔者将举例说明。     首先用以下SQL语句建一个含BLOB字段的数据表:     CREATE TABLE REPORTTABLE(REGISTERNUM CHAR(12) NOT NULL,REPORT BLOB(5M),PRIMARY KEY(REGISTERNUM));     建完该表后,配置好ODBC数据源,设定数据源名为ABCDB。     我们用VC的MFC AppWizard建一个新的Project,设定项目名为ABC,下一步选Single Document,在提示你想包含什么样的数据库支持时,选Header files only,然后完成建立。     接着在Resources的Dailog资源中新建一个FormView,打开该FormView,启用ClassWizard,建立一个新类,设定类名叫CReportRecordSet,Base Class选CRecordSet,然后选ABCDB为数据源,再选择表REPORTTABLE,启动ClassWizrd,并建立新类CReportFormView,Base Class为CRecordView,选Recordset时,选CReportRecordSet。     打开ReportRecordSet.h,找到该行:CString m_REPORT; 改为CLongBinary m_REPORT;这样程序就知道m_REPORT是和BLOB字段交换数据。同样,我们还需要修改另外几处,打开ReportRecordSet.cpp后,删除m_REPORT = _T("");一句。再找到RFX_Text(pFX, _T("[REPORT]"), m_REPORT);一句,将其改为RFX_LongBinary(pFX, _T("[REPORT]"), m_REPORT); ODBC方法存取数据库时使用RFX_LongBinary;DAO方法则用DFX_LongBinary。     再次打开FormView,添加一个Edit控件,并用ClassWizard将它和member variable m_pSet-〉m_ REGISTERNUM关联,然后在FormView上增加三个按键,Caption名分别叫“取得Word文档”、“更新word文档”、“新增word文档”。并分别为这三个按键建立各自的Function,然后我们为这三个按键增加相应的代码。在按键“取得Word文档”的Function中加入如下代码:     try //该程序的所在当前目录是e:\qc\abc\     { if (m_pSet-〉IsEOF())     AfxMessageBox("没有该小组的成果报告");     else {//下面检测临时文件tyj.doc是否存在     HANDLE hFind;     WIN32_FIND_DATA findData = {0};     hFind=FindFirstFile("e:\\qc\\abc\\tyj.doc",&&findData);     // FindFirstFile是Windows API 函数     if(hFind = = INVALID_HANDLE_VALUE)     AfxMessageBox("不存在临时文件");     else     {AfxMessageBox("有临时文件");     DeleteFile("e:\\qc\\abc\\tyj.doc");     //利用API函数删除该临时文件     }     CString strFileName="e:\\qc\\abc\\tyj.doc";     CFile outFile(strFileName,CFile::modeCreate|CFile::modeWrite);     //modeCreate指示构造函数创建一个新文件     //下面这段把已经在内存中的BLOB字段数据内容写到临时生成的文件tyj.doc中     LPSTR buffer = (LPSTR)GlobalLock(m_pSet-〉m_REPORT.m_hData);     outFile.WriteHuge(buffer,m_pSet-〉m_REPORT.m_dwDataLength);     GlobalUnlock(m_pSet-〉m_REPORT.m_hData);     outFile.Close();     ShellExecute(NULL,NULL,_T("tyj.doc"),NULL,_T("e:\\qc\\abc\\"),NULL);     //下面执行外部程序,Word会自动启动并打开tyj.doc} }      catch(CExceptionpE)      { pE-〉ReportError();      pE-〉Delete();      return; }     在按键“更新word文档”的Function中加入以下程序代码:      m_pSet-〉Edit(); // 声明编辑当前记录      UpdateData(TRUE);      CFile fileword;      CFileStatus fileStatus;      CString fileLocate;      static char BASED_CODE szFilter[] = "WORD Files (.doc)|.doc||";     // 下面将弹出典型的打开文件对话框,您可以选择任何目录下的.doc文件      CFileDialog dlg(TRUE,NULL,NULL,0,szFilter,this);      if(dlg.DoModal()= =IDOK)      fileLocate=dlg.GetPathName();      else      fileLocate="";      if(fileLocate= ="")      AfxMessageBox("您没选文件");      else{     fileword.Open(fileLocate,CFile::modeRead);     fileword.GetStatus(fileStatus);     m_pSet-〉m_REPORT.m_dwDataLength=fileStatus.m_size;      HGLOBAL hGlobal = GlobalAlloc(GPTR,fileStatus.m_size);      m_pSet-〉m_REPORT.m_hData = GlobalLock(hGlobal);     fileword.ReadHuge(m_pSet-〉m_REPORT.m_hData,fileStatus.m_size);     //把您选择的文件的数据写入m_pSet-〉m_REPORT      m_pSet-〉SetFieldDirty(&&m_pSet-〉m_REPORT);      m_pSet-〉SetFieldNull(&&m_pSet-〉m_REPORT,FALSE);      m_pSet-〉Update(); // 更新记录      GlobalUnlock(hGlobal); }     上述代码只要稍做修改,即可把Execl等各类文件存入数据库中。对应按键“新增word文档”只需要复制“更新Word文档”中的代码,并把m_pSet-〉Edit();换成m_pSet-〉AddNew();即可。完成上述步骤后,打开abc.cpp,把RUNTIME_CLASS(CAbcView));这句换成RUNTIME_CLASS(CReportFormView)); 这样程序启动时就显示了该FormView。     以上所有代码均在IBM UDB6、Visual C++ 6.0、Windows 98环境下编译通过。
      

  9.   

    to JennyVenus:
       我也做出来了,一种方法跟你的办法大同小异
       另一种办法也能做出来,不过实现起来比较麻烦。呵呵:)
      

  10.   

    to 小古:
          不知道你考虑过更进一步的问题没有,如何能找到一条指定的记录集,然后对记录集中的图片进行更新?这个问题也不好解决,因为不可能用SQL语句来update.
      

  11.   


    推荐使用 ODBC API 函数,用SQL语句直接操作。很方便。兼容性应该没有问题。
      

  12.   

    to zhaoshuo2113(为四里):
        At first,delete;
        At Last,insert into;