问题描述:无法将文件大文本以内存流形式存储到BLOB类型的字段中。以下为表结构:
create table TEST2 ( A BLOB, B VARCHAR2(100) )以下为Delphi插入oracle数据库的执行代码:
procedure TForm1.btn6Click(Sender: TObject);
var BlobTemp: TMemoryStream;
begin
BlobTemp := TMemoryStream.Create;
BlobTemp.Position:=0;
//redt1为TRichEdit类型的组件
redt1.Lines.SaveToStream(BlobTemp); //cmd1为TADOCommand类型组件
with cmd1 do
begin
CommandText:='insert into test2 values(:a,:b)';
Parameters.ParamByName('a').LoadFromStream(BlobTemp, ftBlob);
Parameters.ParamByName('b').Value:='123';
Execute;
end;
end;执行以上过程,当redt1.Lines中的内容很少(少于3237个字符)时可以成功插入数据库中,但是当redt1.Lines中的内容大于3237是就会出现以下错误:
ORA-03113: end-of-file on communication channel.
如果将A字段的BLOB类型更改为LONG RAW类型却没有能成功插入大文本,为什么会出现ORA-03113的错误呢?如何在继续保持字段类型为BLOB的情况下实现这个功能呢?
create table TEST2 ( A BLOB, B VARCHAR2(100) )以下为Delphi插入oracle数据库的执行代码:
procedure TForm1.btn6Click(Sender: TObject);
var BlobTemp: TMemoryStream;
begin
BlobTemp := TMemoryStream.Create;
BlobTemp.Position:=0;
//redt1为TRichEdit类型的组件
redt1.Lines.SaveToStream(BlobTemp); //cmd1为TADOCommand类型组件
with cmd1 do
begin
CommandText:='insert into test2 values(:a,:b)';
Parameters.ParamByName('a').LoadFromStream(BlobTemp, ftBlob);
Parameters.ParamByName('b').Value:='123';
Execute;
end;
end;执行以上过程,当redt1.Lines中的内容很少(少于3237个字符)时可以成功插入数据库中,但是当redt1.Lines中的内容大于3237是就会出现以下错误:
ORA-03113: end-of-file on communication channel.
如果将A字段的BLOB类型更改为LONG RAW类型却没有能成功插入大文本,为什么会出现ORA-03113的错误呢?如何在继续保持字段类型为BLOB的情况下实现这个功能呢?
Stream1: TBlobStream;
Stream2: TStream;
begin
Stream1 := TBlobStream.Create(Table1Notes, bmRead);
try
ClientDataSet1.Edit;
{ here抯 a different way to create a blob stream }
Stream2 := ClientDataSet1.CreateBlobStream(ClientDataSet1.FieldByName('Res'), bmReadWrite);
try
Stream2.CopyFrom(Stream1, Stream1.Size);
ClientDataSet1.Post;
finally
Stream2.Free;
end; finally
Stream1.Free;
end;
end;
1).用bde要改参数。
2).用ADO要升级
3).用ADO要用"Oracle Provider for OLE DB"不要用"Microsoft OLE DB Provider for Oracle"
2.如果两个BLOB字段以上(其实一个字段也可用):
http://topic.csdn.net/t/20061107/16/5140028.html
(JAVA的,适用于delphi)
关键:
insert into test values(empty_blob(),empty_blob()) returning a1,a2 into :a1,:a2