使用ADO向数据库表插入第一个Blob字段时,总是出错,但如果已经有数据,就不会出错,这是怎么回事?

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

5 个解决方案

#1


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

#2


该回复被版主删除

#3


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

#4


下面的程序可以把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]
GO

CREATE TABLE [dbo].[Table1] (
[filename] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[content] [image] NULL 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

#5


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

#1


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

#2


该回复被版主删除

#3


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

#4


下面的程序可以把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]
GO

CREATE TABLE [dbo].[Table1] (
[filename] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[content] [image] NULL 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

#5


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