我的程序使用ado向数据库表插入数据时,如果记录中包含blob字段,而且表为空,运行时就会报一个错误,这个blob字段里面存放的是一个mpeg文件,错误是一个Debug Assertion,点击retry后程序就跳到了CRTOMSG.C里面的221行,是在ado的RecordSet进行update时出的错,但是数据还是被正确的插入到表中了。再次插入同样的数据就不会再出错,但如果把数据表清空,就会出现同样的情况,在插入第一条数据时出错,以后不再出错
我使用同样的代码插入图片文件就不会出错,但录像文件和图片文件的区别就在于录像文件的大小都在10M以上,图片文件是1M以下
请高手们指点我一下究竟是什么原因?

解决方案 »

  1.   

    你的什么数据库?MYSQL 的最大字段长度就是1M多一点。
      

  2.   

    是sqlserver,应该够的,如果表里面有数据的话,就不会出问题,只是插入第一条数据的时候会出错
      

  3.   

    下面的程序可以把18Mb的文件插入到空的表中
    // ocistudy.cpp : Defines the entry point for the console application.
    //#include "stdafx.h"//pass blob to stored procedure 
    //build by masterz 20050301 with VC2003, Windows 2003, SQLServer 2000.
    #include "stdafx.h"
    #import "C:\PROGRA~1\COMMON~1\System\ado\msado15.dll" rename( "EOF", "adoEOF" )
    struct InitOle
    {
    InitOle()  { ::CoInitialize(NULL); }
    ~InitOle() { ::CoUninitialize();  }
    } _init_InitOle_;
    void PrintProviderError(ADODB::_ConnectionPtr pConnection);void print_properties(LPCTSTR name, ADODB::PropertiesPtr Properties)
    {
    long prop_count = Properties->GetCount();
    printf("%s property count = %d\n",name,prop_count);
    for(long i=0;i<prop_count;i++)
    {
    printf("%s property [%d]:%s\n",name,i,(LPCSTR)Properties->GetItem(i)->Name);
    }
    }
    int main(int argc, char* argv[])
    {
    ADODB::_ConnectionPtr  Conn1;
    ADODB::_CommandPtr    Cmd1;
    ADODB::_ParameterPtr  oldParam= NULL;
    ADODB::_ParameterPtr inParam=NULL;
    ADODB::_ParameterPtr blobParam=NULL;
    _variant_t  vtEmpty (DISP_E_PARAMNOTFOUND, VT_ERROR);
    _variant_t  vtEmpty2 (DISP_E_PARAMNOTFOUND, VT_ERROR);
    //_bstr_t    bstrConnect="Provider=OraOLEDB.Oracle;Data Source=orcl;User Id=system;Password=oracle;";
     _bstr_t    bstrConnect="Driver={SQL Server};Server=localhost;Database=zxg;Uid=sa;Pwd=sa;" ;
     //create procedure dbo.insert_update_blob(@fn varchar(9),@filecontent image) as
    // if exists (select * from table1 where filename=@fn )
    //  begin
    //  update table1 set content=@filecontent where filename=@fn
    //  end
    // else
    // begin
    // insert table1 (filename,content) values(@fn,@filecontent)
    // end
    _bstr_t    bstrSP("{CALL insert_update_blob(?,?)}" );
    try
    {
    _variant_t varOptional(DISP_E_PARAMNOTFOUND,VT_ERROR); 
    ADODB::_StreamPtr adostream;
    adostream.CreateInstance(_T("ADODB.Stream"));
    adostream->Type = ADODB::adTypeBinary;
    adostream->Open(varOptional,ADODB::adModeUnknown, ADODB::adOpenStreamUnspecified, _T(""), _T("")); 
    adostream->LoadFromFile("f:\\masterz.zip");
    _variant_t vReadTo = adostream->Read(ADODB::adReadAll); 
    long blob_size = adostream->GetSize();
    adostream->Close(); _bstr_t bstrEmpty;
    Conn1.CreateInstance( __uuidof( ADODB::Connection ) );
    Cmd1.CreateInstance( __uuidof( ADODB::Command ) );
    Conn1->ConnectionString = bstrConnect;
    Conn1->Open( bstrConnect, bstrEmpty, bstrEmpty, -1 );
    Cmd1->ActiveConnection = Conn1;
    Cmd1->CommandText      = bstrSP;
    Cmd1->CommandType      = ADODB::adCmdText;
    Conn1->Properties->Refresh();
    inParam = Cmd1->CreateParameter(_bstr_t("@fn"),ADODB::adChar,ADODB::adParamInput,2,_variant_t( "a" ));
    Cmd1->Parameters->Append(inParam);
    blobParam = Cmd1->CreateParameter(_bstr_t("@filecontent"),ADODB::adLongVarBinary,ADODB::adParamInput,blob_size,vReadTo);
    Cmd1->Parameters->Append(blobParam);
    Cmd1->Properties->Refresh();
    print_properties("Cmd1",Cmd1->Properties);
    Cmd1->Execute(NULL,NULL,ADODB::adExecuteNoRecords);
    Conn1->Close();
    //select filename,datalength(content) from table1 where datalength(content)>0
    }
    catch(_com_error &e)
    {
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());
    printf("\nCOM error occurred, Source : %s \n Description : %s \n",(LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    PrintProviderError(Conn1);
    }
    printf("\nprogram end\n");
    return 0;
    }
    VOID PrintProviderError(ADODB::_ConnectionPtr pConnection)
    {
    ADODB::ErrorPtr  pErr = NULL;
    long      nCount = 0;
    long      i = 0;
    if( (pConnection->Errors->Count) > 0)
    {
    nCount = pConnection->Errors->Count;
    for(i = 0; i < nCount; i++)
    {
    pErr = pConnection->Errors->GetItem(i);
    printf("\n\t Error number: %x\t%s", pErr->Number, (LPCSTR)pErr->Description);
    }
    }
    }
    用到的表:
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Table1]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[Table1]
    GOCREATE TABLE [dbo].[Table1] (
    [filename] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [content] [image] NULL 
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
      

  4.   

    非常感谢masterz(www.fruitfruit.com) 大侠,但是您的代码里面有一些内容我看不懂,譬如ADODB::_StreamPtr 这个类型我过去从来就没有见过,请问这些用法哪里有介绍?