procedure TForm1.Button1Click(Sender: TObject);
var
tempFile:TFileStream;
strName:string;
strSql:string;
begin
if opendialog1.Execute then
strName:=opendialog1.FileName;
try
tempFile:=TFileStream.Create(strName,fmOpenRead);
strSql:='';
strSql:=strSql+'insert into fileSave values(';
strSql:=strSql+Quotedstr(strName)+',';
strSql:=strSql+':FileSelf'+')';
with adoquery1 do
begin
close;
sql.Clear;
sql.Add(strSql);
TBlobField(parameters.ParamByName('FileSelf')).LoadFromStream(tempFile); //运行到这句总出错,为何?
ExecSql;
end;finally
tempFile.Free;
end;
end;
var
tempFile:TFileStream;
strName:string;
strSql:string;
begin
if opendialog1.Execute then
strName:=opendialog1.FileName;
try
tempFile:=TFileStream.Create(strName,fmOpenRead);
strSql:='';
strSql:=strSql+'insert into fileSave values(';
strSql:=strSql+Quotedstr(strName)+',';
strSql:=strSql+':FileSelf'+')';
with adoquery1 do
begin
close;
sql.Clear;
sql.Add(strSql);
TBlobField(parameters.ParamByName('FileSelf')).LoadFromStream(tempFile); //运行到这句总出错,为何?
ExecSql;
end;finally
tempFile.Free;
end;
end;
大对象字段,最好不要用sql.
adoquery.append();
TBlobField(parameters.ParamByName('FileSelf')).LoadFromStream(tempFile);
adoquery.post();
//函数名: AddDocIntoTable
//参数:
// aFileName:string 文件名,含全路径
// Table:TADOTable 表名,所用的数据表控件的名称
//返回:boolean 添加到表成功则返回true,否则返false
//描述: 本函数将指定的文件导入数据库中.
function TfrmMain.AddDocIntoTable(aFileName:string;Table:TADOTable):boolean;
var
MStream: TMemoryStream;
FileName:string;begin
if(not FileExists(aFileName)and (ExtractFileExt(aFileName) = ''))then
begin
result:=false;
exit;
end;
try
//得到文件名
FileName:=ExtractFilename(aFileName);
if not Table.Active then Table.Active :=true;
//装载文件到流
MStream:=TMemoryStream.create;
try MStream.LoadFromFile(aFileName);
except
ShowMessage('不能打开文件,这个文件可能被其他程序打开了。');
MStream.Free;
Result:=false;
exit;
end;
MStream.Position :=0; //添加数据到数据库中
Table.Append ;
Table.FieldByName('FileName').asString :=FileName;
TBlobField(Table.FieldByName('File')).LoadFromStream(MStream);
Table.Post ;
//释放流
MStream.Free ;
except
//出错返回
if(MStream<>nil)then MStream:=nil ;
Result:=false;
exit;
end;
Result:=true;
end;
//函数名: SaveTableDocToFile
//参数:
// aFilePath:string 路径,最后字符不是'\'
// Table:TADOTable 表名,所用的数据表控件的名称
//返回:boolean 保存文件成功则返回true,否则返false
//描述: 本函数将从数据库读取当前指针所指记录,并写入文件中.function TfrmMain.SaveTableDocToFile(aFilePath:string;Table:TADOTable):boolean;
var
MStream:TStream;
MFileStream:TFileStream;
pImage: pointer;
FileName:string;
aFileName:String;
begin
try
if not Table.Active then Table.Active :=true;
//从数据库读出文件信息
MStream:=Table.CreateBlobStream(Table.FieldbyName('File'),bmRead);
FileName :=Table.FieldByName('FileName').asString ; //组合文件名
aFileName := aFilePath+'\'+ FileName;
MStream.Position:=0;
GetMem(pImage, MStream.Size);
//创建文件
MFileStream := TFileStream.Create(aFileName, fmCreate);
MStream.Read(pImage^,MStream.Size);
MFileStream.Write(pImage^ ,MStream.Size);
FreeMem(pImage); MFileStream.Free ;
MStream.Free ;
except
if(MStream<>nil)then MStream:=nil ;
if(MFileStream<>nil)then MFileStream:=nil ;
Result:=false;
exit;
end;
Result:=true;
end;
用adoquery成功了吗?
var
tempFile:TMemoryStream;
strName:string;
begin
strName:='F:\原码控件资料\关于通用进销存的模块设置与与功能流程的文档 .doc';
try
tempFile := TMemoryStream.Create ;
tempFile.LoadFromFile(strName);
with adoquery1 do
begin
close;
sql.Clear;
sql.Add('insert into file1(id, afile) values(1,:FileSelf)');
parameters.ParamByName('FileSelf').LoadFromStream(tempFile, ftBlob);
ExecSql;
end;
finally
tempFile.Free;
end;
但是怎么读呢?有问题。
procedure TForm1.BitBtn1Click(Sender: TObject);
var
tempFile:TMemoryStream;
str:string;begin
adotable1.Open;
adotable1.First;
try
tempFile:=TMemoryStream.Create;
tempFile.Position:=0;
TBlobField(adotable1.FieldByName('fileself')).SaveToStream(tempFile);
//////write stream error 这是怎么了?
OleContainer1.LoadFromStream(tempFile);
finally
tempFile.Free;
end;
多谢!!
tempFile:=TMemoryStream.Create;
// tempFile.Position:=0;
TBlobField(adotable1.FieldByName('fileself')).SaveToStream(tempFile);
tempfile.Position:=0;
OleContainer1.LoadFromStream(tempFile);
//ERROR!!
//无效的流格式
//invalid stream format
//谁能告诉我?多谢·!!!!
olecontainer1.DoVerb(1);
finally
tempFile.Free;
end;
adoQuery1.close;
adoQuery1.sql.clear;
adoQuery1.sql.text:='select * from czsc';
adoQuery1.open;
adoQuery1.append;
adoQuery1.fieldbyname('bh').value:=bh;
adoQuery1.fieldbyname('title').value:=title;
adoQuery1.fieldbyname('bgr').value:=sddsmainfrm.global_username;
adoquery1.FieldByName('jg_dm').Value:=sddsmainfrm.global_bh;
TBlobField(adoQuery1.fieldbyname('topic')).loadfromstream(ms);
ms.free;
adoQuery1.post;
adoQuery1.close;
ms:TMemoryStream;
bh,tablename:string;
title:string;
现在写入没有问题了,但是读出的有问题。
procedure TForm1.BitBtn1Click(Sender: TObject);
var
tempFile:TMemoryStream; str:string;begin adotable1.Open;
adotable1.Last;
try
tempFile:=TMemoryStream.Create;
TBlobField(adotable1.FieldByName('fileself')).SaveToStream(tempFile);
tempfile.Position:=0;
OleContainer1.LoadFromStream(tempFile); //这一句有问题,无效的stream格式,
这是怎么回事?
olecontainer1.DoVerb(1);
finally
tempFile.Free;
end;end;
是这样吗?如果是这样的话,那么用别的流(tfilestream,tmemorystream)等
保存到数据库中的Word文档该如何显示呢?多谢!!
用Word打开
用Word打开
{
function filedisplay
从数据库里将文章显示在ole当中
}
procedure Tyeargzcgwritefrm.filedisplay(var bh:string;tablename:string);
var
strstream:Tmemorystream;
str_query:string;
begin
str_query:='select topic from '+tablename+' where bh='''+bh+'''';
OleContainer1.DestroyObject;
strstream := Tmemorystream.Create;
adoquery1.Close;
adoquery1.sql.clear;
adoquery1.SQL.Add(str_query) ;
adoquery1.open ;
adoquery1.First;
Tblobfield(adoquery1.fieldbyname('topic')).savetostream(strstream);
strstream.position:=0;
OleContainer1.loadfromstream(strstream);
strstream.free;
end;
scu96124678(绿林侠) :
这样读出的是乱码,包括了一些格式之类的东西,我用你的两种方法都试了,
都不行,都是乱码。
请问,你成功了吗?多谢!!
直接用TMemoryStream或者TFileStream存入数据库的,都不能读出,均为乱码。
怎么办?
我希望用Ado实现,可以吗?
用其他格式stream存进数据库重的blob字段,
该如何读出呢?
多谢!!
其他流格式可以转化为临时文件‘aaa.nnn’然后ole1.LoadFromFile(‘aaa.nnn’);
文章,说是Ole并不能加载所有的流格式,这样的话,是否用其他流存入数据
的blob就没有用了?因为并不能用Ole读出亚?怎么办?楼上的意思是:其他格式流存入的blob,如果转为一临时文件,再用Ole加载,
就可以了?我试试。
你的意思是否:在存入数据库的时候,也需要用ole作一个过渡(转为临时文件),然后
把这个临时文件存入数据库?然后,读出的时候,ole就正常了?这样是可以得,我已经测试过了,
我想:能否不作这个过渡,然后直接用ole读出呢?
多谢!
否则,用ole是读不出来得?如果不用ole读,是否还有别的方法读出?
text := Sender.Astring;
blobFieldName.SetText事件
Sender.Astring:= text ;
调用DBGrid1DrawColumnCell事件
unit DrawForm;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
DBTables, DB, Grids, DBGrids, ExtCtrls, StdCtrls, DBCtrls;type
TForm1 = class(TForm)
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Table1: TTable;
Table1SpeciesNo: TFloatField;
Table1Category: TStringField;
Table1Common_Name: TStringField;
Table1Lengthcm: TFloatField;
Table1Notes: TMemoField;
Table1Graphic: TGraphicField;
procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
procedure FormCreate(Sender: TObject);
procedure Table1NotesGetText(Sender: TField; var Text: String;
DisplayText: Boolean);
procedure Table1NotesSetText(Sender: TField; const Text: String);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
Bmp: TBitmap;
OutRect: TRect;
BmpWidth: Integer;
begin
// default output rectangle
OutRect := Rect; if Column.Field = Table1Common_Name then
begin
// draw the image
Bmp := TBitmap.Create;
try
Bmp.Assign (Table1Graphic);
BmpWidth := (Rect.Bottom - Rect.Top) * 2;
OutRect.Right := Rect.Left + BmpWidth;
DBGrid1.Canvas.StretchDraw (OutRect, Bmp);
finally
Bmp.Free;
end;
// reset output rectangle, leaving space for the graphic
OutRect := Rect;
OutRect.Left := OutRect.Left + BmpWidth;
end; // red font color if length > 100
if (Column.Field = Table1Lengthcm) and
(Table1Lengthcm.AsInteger > 100) then
DBGrid1.Canvas.Font.Color := clRed; // default drawing
DBGrid1.DefaultDrawDataCell (OutRect, Column.Field, State);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
Table1.Active := True;
end;procedure TForm1.Table1NotesGetText(Sender: TField; var Text: String;
DisplayText: Boolean);
begin
Text := Trim (Sender.AsString);
end;procedure TForm1.Table1NotesSetText(Sender: TField; const Text: String);
begin
Sender.AsString := Text;
end;end.object Form1: TForm1
Left = 209
Top = 157
Width = 790
Height = 309
Caption = 'Draw Data Grid'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = True
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object DBGrid1: TDBGrid
Left = 0
Top = 0
Width = 782
Height = 282
Align = alClient
BorderStyle = bsNone
DataSource = DataSource1
DefaultDrawing = False
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -16
Font.Name = 'MS Sans Serif'
Font.Style = [fsBold]
Options = [dgEditing, dgAlwaysShowEditor, dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgConfirmDelete, dgCancelOnExit]
ParentFont = False
TabOrder = 0
TitleFont.Charset = DEFAULT_CHARSET
TitleFont.Color = clWindowText
TitleFont.Height = -11
TitleFont.Name = 'MS Sans Serif'
TitleFont.Style = []
OnDrawColumnCell = DBGrid1DrawColumnCell
end
object DataSource1: TDataSource
DataSet = Table1
Left = 24
Top = 16
end
object Table1: TTable
DatabaseName = 'DBDEMOS'
FieldDefs = <
item
Name = 'Species No'
DataType = ftFloat
end
item
Name = 'Category'
DataType = ftString
Size = 15
end
item
Name = 'Common_Name'
DataType = ftString
Size = 30
end
item
Name = 'Species Name'
DataType = ftString
Size = 40
end
item
Name = 'Length (cm)'
DataType = ftFloat
end
item
Name = 'Length_In'
DataType = ftFloat
end
item
Name = 'Notes'
DataType = ftMemo
Size = 50
end
item
Name = 'Graphic'
DataType = ftGraphic
end>
IndexDefs = <
item
Name = 'Table1Index1'
Fields = 'Species No'
Options = [ixPrimary, ixUnique]
end>
StoreDefs = True
TableName = 'biolife.db'
UpdateMode = upWhereChanged
Left = 24
Top = 72
object Table1SpeciesNo: TFloatField
FieldName = 'Species No'
Visible = False
end
object Table1Category: TStringField
DisplayWidth = 12
FieldName = 'Category'
Size = 15
end
object Table1Common_Name: TStringField
DisplayWidth = 23
FieldName = 'Common_Name'
Size = 30
end
object Table1Lengthcm: TFloatField
DisplayWidth = 9
FieldName = 'Length (cm)'
end
object Table1Notes: TMemoField
DisplayWidth = 36
FieldName = 'Notes'
OnGetText = Table1NotesGetText
OnSetText = Table1NotesSetText
BlobType = ftMemo
Size = 50
end
object Table1Graphic: TGraphicField
DisplayWidth = 9
FieldName = 'Graphic'
Visible = False
BlobType = ftGraphic
end
end
end
MS: TMemoryStream;
begin
MS:=TMemoryStream.create;
MStream.LoadFromFile(MS);
MS.Position:=0;
Table1.Append;
file://在数据库中添加一条记录
TBlobField(Table1.FieldbyName
('image')).LoadFromStream(MS);
Table1.Post;
file://将所作的更新写入数据库
end;
比如:如果写入的是Word,但是读出后用olecontainer
是不能加载的,你是如何处理的?或者用什么方法可以
把这个word文件显示?olecontainer的流格式不对,不能载入!