procedure TForm1.button1Click(Sender: TObject);//写 var sfilename:string; function BlobContentTostring(const Filename:string):string; begin with Tfilestream.Create(filename,fmopenread) do try setlength(result,size); read(pointer(result)^,size); finally free; end; end; begin if opendialog1.Execute then begin sfilename:=opendialog1.FileName; ADOQuery1.append; ADOQuery1.FieldByName('word').AsString:=blobcontenttostring(sfilename); ADOQuery1.Post; end; end; procedure TForm1.button2Click(Sender: TObject);//读 var sfilename:string; bs:Tadoblobstream; begin bs:=Tadoblobstream.Create(TBLOBfield(ADOQuery1.FieldByName('word')),bmread); try sfilename:='c:\cc.doc'; bs.SaveToFile(sfilename); finally bs.free; end; end;
简单,首先 创建一个表: BEGIN TRANSACTION CREATE TABLE BLOBDB1 ( TITLE VARCHAR(50) NOT NULL , TXT TEXT NULL , JPEG IMAGE NULL , BMP IMAGE NULL , EXT VARCHAR(10) NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] IF @@ERROR<>0 BEGIN ROLLBACK TRAN GOTO ON_ERROR END ALTER TABLE DBO.BLOBDB1 ADD CONSTRAINT PK_BLOBDB1 UNIQUE CLUSTERED (TITLE ) ON [PRIMARY] IF @@ERROR<>0 BEGIN ROLLBACK TRAN GOTO ON_ERROR END COMMIT ON_ERROR: SELECT 1 AS Error_OK GO 然后编写单元文件,现提供如下(*.pas;*.dfm) unit saveblobtoDB;//written by zjy6631 interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, CheckLst, ComCtrls, Grids, DBCtrls, DB, Mask, ADODB, ExtCtrls,jpeg;type TsaveBlobtoDBForm = class(TForm) PageControl1: TPageControl; TabSheet3: TTabSheet; ADODS1: TADODataSet; ADOConnection1: TADOConnection; ADODS1TITLE: TStringField; ADODS1TXT: TMemoField; ADODS1JPEG: TBlobField; ADODS1BMP: TBlobField; Label1: TLabel; DBEdit1: TDBEdit; DataSource1: TDataSource; Label2: TLabel; DBMemo1: TDBMemo; Label4: TLabel; savetxt1: TButton; savejpeg1: TButton; OpenDialog1: TOpenDialog; ADODS1EXT: TStringField; Image1: TImage; DBNavigator1: TDBNavigator; Button1: TButton; procedure savejpeg1Click(Sender: TObject); procedure savetxt1Click(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var saveBlobtoDBForm: TsaveBlobtoDBForm;implementation{$R *.dfm}procedure TsaveBlobtoDBForm.savejpeg1Click(Sender: TObject); begin OPendialog1.Filter:='*.jpg|*.jpg|*.txt|*.txt|*.bmp|*.bmp|*.jpeg|*.jpeg'; if OPendialog1.Execute then begin AdoDs1.Open; AdoDs1.Append; ADODS1TITLE.AsString:=OPendialog1.FileName; Try ADODS1.FieldByName('Ext').AsString:=ExtractFileExt(Opendialog1.FileName); ADODS1JPEG.LoadFromFile(Opendialog1.FileName); AdoDs1.Post; except AdoDs1.Cancel; end; end; end;procedure TsaveBlobtoDBForm.savetxt1Click(Sender: TObject); begin OPendialog1.Filter:='*.txt|*.txt'; if OPendialog1.Execute then begin AdoDs1.Append; ADODS1TITLE.AsString:=OPendialog1.FileName; ADODS1TXT.LoadFromFile(OPendialog1.FileName); end; AdoDs1.Post; end;procedure TsaveBlobtoDBForm.Button1Click(Sender: TObject); begin Try AdoDs1jpeg.SaveToFile('temp.jpEg'); Image1.Picture.LoadFromFile('temp.jpEg'); except end; end;end. --------------- *.dfmobject saveBlobtoDBForm: TsaveBlobtoDBForm Left = 205 Top = 107 Width = 544 Height = 375 Caption = 'saveBlobtoDBForm' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 16 object PageControl1: TPageControl Left = 0 Top = 0 Width = 536 Height = 348 ActivePage = TabSheet3 Align = alClient TabOrder = 0 object TabSheet3: TTabSheet Caption = 'TabSheet3' ImageIndex = 2 object Label1: TLabel Left = 47 Top = 32 Width = 37 Height = 16 Caption = 'TITLE' FocusControl = DBEdit1 end object Label2: TLabel Left = 48 Top = 72 Width = 26 Height = 16 Caption = 'TXT' FocusControl = DBMemo1 end object Label4: TLabel Left = 344 Top = 152 Width = 29 Height = 16 Caption = 'BMP' end object Image1: TImage Left = 280 Top = 128 Width = 153 Height = 177 Stretch = True Transparent = True end object DBEdit1: TDBEdit Left = 46 Top = 48 Width = 804 Height = 24 DataField = 'TITLE' DataSource = DataSource1 TabOrder = 0 end object DBMemo1: TDBMemo Left = 48 Top = 92 Width = 185 Height = 89 DataField = 'TXT' DataSource = DataSource1 TabOrder = 1 end object savetxt1: TButton Left = 272 Top = 96 Width = 72 Height = 26 Caption = 'savetxt1' TabOrder = 2 OnClick = savetxt1Click end object savejpeg1: TButton Left = 376 Top = 96 Width = 75 Height = 26 Caption = 'savejpeg1' TabOrder = 3 OnClick = savejpeg1Click end object DBNavigator1: TDBNavigator Left = 216 Top = 8 Width = 230 Height = 33 DataSource = DataSource1 TabOrder = 4 end object Button1: TButton Left = 32 Top = 224 Width = 73 Height = 25 Caption = 'loadjpeg' TabOrder = 5 OnClick = Button1Click end end end object ADODS1: TADODataSet Active = True Connection = ADOConnection1 CursorType = ctStatic CommandText = 'blobDB' CommandType = cmdTable Parameters = <> Left = 292 Top = 171 object ADODS1TITLE: TStringField FieldName = 'TITLE' Size = 50 end object ADODS1TXT: TMemoField FieldName = 'TXT' BlobType = ftMemo end object ADODS1JPEG: TBlobField FieldName = 'JPEG' GraphicHeader = False end object ADODS1BMP: TBlobField AutoGenerateValue = arDefault FieldName = 'BMP' end object ADODS1EXT: TStringField FieldName = 'EXT' Size = 10 end end object ADOConnection1: TADOConnection Connected = True ConnectionString = 'Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initi' + 'al Catalog=DB_0002' LoginPrompt = False Provider = 'SQLOLEDB.1' Left = 188 Top = 251 end object DataSource1: TDataSource DataSet = ADODS1 Left = 472 Top = 128 end object OpenDialog1: TOpenDialog Filter = '*.jpg|*.jpg|*.txt|*.txt|*.bmp|*.bmp|*.jpeg|*.jpeg' Left = 484 Top = 179 end end
对于其他类型的文件,可像对待jpeg一样处理。你可以把mp3存入数据库,当然,要把扩展名写入Ext字段中,因此,上述代码的读入操作可进行更该: procedure TsaveBlobtoDBForm.Button1Click(Sender: TObject); begin Try if ((AdoDs1Ext.AsString='jpg') or (AdoDs1Ext.AsString='jpeg')) then begin AdoDs1jpeg.SaveToFile('temp.jpeg'); Image1.Picture.LoadFromFile('temp.jpeg'); end else if AdoDs1Ext.AsString='mp3' then begin //播放mp3 end else if AdoDs1ext.AsString='doc' then begin //打开word 文档 end; except end; end;
用text类型存放不就可以(SYBASE里支持2m)?
哦,要是图片的有些复杂,不过也可以有 image.
Microsoft® SQL Server™ 的 ntext、text 和 image 数据类型在单个值中可以包含非常大的数据量(最大可达 2 GB)。单个数据值通常比应用程序在一个步骤中能够检索的大;某些值可能还会大于客户端的可用虚拟内存。因此,在检索这些值时,通常需要一些特殊的步骤。如果 ntext、text 和 image 数据值不超过 Unicode 串、字符串或二进制串的长度(分别为 4,000 个字符、8,000 个字符和 8,000 个字节),就可以在 SELECT、UPDATE 和 INSERT 语句中引用它们,其引用方式与较小的数据类型相同。例如,包含短值的 ntext 列可以在 SELECT 语句的选择列表中引用,这与 nvarchar 列的引用方式相同。引用时必须遵守一些限制,例如不能在 WHERE 子句中直接引用 ntext、text 或 image 列。这些列可以作为返回其它数据类型(例如 ISNULL、SUBSTRING 或 PATINDEX)的某个函数的参数包含在 WHERE 子句中,也可以包含在 IS NULL、IS NOT NULL 或 LIKE 表达式中。处理较大的数据值
但是,如果 ntext、text 和 image 数据值较大,则必须逐块处理。Transact-SQL 和数据库 API 均包含使应用程序可以逐块处理 ntext、text 和 image 数据的函数。数据库 API 按照一种通用的模式处理长 ntext、text 和 image 列: 若要读取一个长列,应用程序只需在选择列表中包含 ntext、text 或 image 列,并将该列绑定到一个程序变量,该变量应足以容纳适当的数据块。然后,应用程序就可以执行该语句,并使用 API 函数或方法将数据逐块检索到绑定的变量中。
若要写入一个长列,应用程序可使用参数标记 (?) 在相应位置代替 ntext、text 或 image 列中的值,以执行 INSERT 或 UPDATE 语句。参数标记(对 ADO 而言则为参数)被绑定到一个足以容纳数据块的程序变量上。应用程序进入循环,在循环中先将下一组数据移到绑定的变量中,然后调用 API 函数或方法写入数据块。这一过程将反复进行,直到整个数据值发送完毕。
使用 text in row
Microsoft® SQL Server™ 2000 将大于 8,000 个字符的字符串和大于 8,000 个字节的二进制数据存储为称作 text 和 image 的特殊数据类型。大于 4000 个字符的 Unicode 字符串被存储在 ntext 数据类型中。例如,必须将一个有关用户信息的大文本文件 (.txt) 导入到 SQL Server 数据库中。应将这些数据作为一个数据块存储起来,而不是集成到数据表的多个列中。为了达到这个目的,可以创建一个 text 数据类型的列。然而,如果必须存储当前作为标记图象文件格式 (TIFF) 图像 (.tif) 存储的、每个大小为 10 KB 的公司徽标,则需创建一个 image 数据类型的列。如果要存储的文本数据是 unicode 形式,那么应使用 ntext 数据类型。例如,一个为国际客户创建的套用信函很可能包含用于各种不同语言的国际拼写和字符。这种数据应存储到一个 ntext 列中。每个 text 和 ntext 数据值都有排序规则。排序规则定义特性,如比较规则以及是否区分大小写或重音。text 值的排序规则还指定代码页,后者定义用于表示每个字符的位模式。每个 ntext 值使用对所有排序规则都相同的 Unicode 代码页。每个数据库有默认排序规则。当创建 text 或 ntext 列时,除非使用 COLLATE 子句指派特定的排序规则,否则将为它们指派数据库的默认排序规则。当合并或比较两个具有不同排序规则的 text 或 ntext 值时,排序规则的优先顺序规则决定操作所使用的排序规则。image 数据中的数据被存储为位串,SQL Server 不对它进行解释。image 列数据的解释必须由应用程序完成。例如,应用程序可以使用 BMP、TIFF、GIF 或 JPEG 格式把数据存储在 image 列中。读取 image 列的数据的应用程序必须识别该数据格式并正确显示数据。image 列所做的全部工作就是提供一个位置,用来存储组成图像数据值的位流。使用行中的文本存储 text、ntext 和 image 值
通常情况下,text、ntext 或 image 字符串是存储在数据行外的大型(可达 2GB)字符或二进制字符串。数据行只包括一个 16 字节的文本指针,该指针指向一个树的根节点,该树由映射存储串片段的页的内部指针构成。使用 Microsoft SQL Server,可将小型到中型的 text、ntext 和 image 值存储在一个数据行中,从而提高访问这些值的查询速度。当 text、ntext 或 image 串被存储在数据行时,SQL Server 就无须访问单独的页或页的集合来读写这些串。这使得读写 text、ntext 或 image 这些行中的串就象读写 varchar、nvarchar 或 varbinary 串一样快。为了在数据行中存储 text、ntext 或 image 字符串,必须使用 sp_tableoption 存储过程启动 text in row 选项。sp_tableoption N'MyTable', 'text in row', 'ON'可以为在数据行中存储的 text、ntext 和 image 字符串指定一个从 24 到 7000 字节的最大长度(可选):sp_tableoption N'MyTable', 'text in row', '1000'如果指定的是"ON"而不是一个特定的限度,则此限度的默认值为 256 字节。这个默认值提供大部分的性能收益:这个值足够大,可以保证小型字符串和根文本指针存储在行中;但又不是过大,以致将每页的行减少得太多,从而影响了性能。尽管在通常情况下,不应将此值设为低于 72,但也不应把此值设得过高,特别是对那些大多数语句都不引用 text、ntext 和 image 列的表格或者具有多个 text、ntext 和 image 列的表格。 也可以使用 sp_tableoption 关闭此选项,这可以通过指定"OFF" 或 0 选项值来实现。sp_tableoption N'MyTable', 'text in row', 'OFF'
var
sfilename:string;
function BlobContentTostring(const Filename:string):string;
begin
with Tfilestream.Create(filename,fmopenread) do
try
setlength(result,size);
read(pointer(result)^,size);
finally
free;
end;
end;
begin
if opendialog1.Execute then
begin
sfilename:=opendialog1.FileName;
ADOQuery1.append;
ADOQuery1.FieldByName('word').AsString:=blobcontenttostring(sfilename);
ADOQuery1.Post;
end;
end;
procedure TForm1.button2Click(Sender: TObject);//读
var
sfilename:string;
bs:Tadoblobstream;
begin
bs:=Tadoblobstream.Create(TBLOBfield(ADOQuery1.FieldByName('word')),bmread);
try
sfilename:='c:\cc.doc';
bs.SaveToFile(sfilename);
finally
bs.free;
end;
end;
BEGIN TRANSACTION
CREATE TABLE BLOBDB1 (
TITLE VARCHAR(50) NOT NULL ,
TXT TEXT NULL ,
JPEG IMAGE NULL ,
BMP IMAGE NULL ,
EXT VARCHAR(10) NULL
) ON [PRIMARY]
TEXTIMAGE_ON [PRIMARY]
IF @@ERROR<>0 BEGIN
ROLLBACK TRAN
GOTO ON_ERROR
END ALTER TABLE DBO.BLOBDB1 ADD CONSTRAINT
PK_BLOBDB1 UNIQUE CLUSTERED
(TITLE ) ON [PRIMARY]
IF @@ERROR<>0 BEGIN
ROLLBACK TRAN
GOTO ON_ERROR
END COMMIT
ON_ERROR:
SELECT 1 AS Error_OK
GO
然后编写单元文件,现提供如下(*.pas;*.dfm)
unit saveblobtoDB;//written by zjy6631 interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, CheckLst, ComCtrls, Grids, DBCtrls, DB, Mask, ADODB,
ExtCtrls,jpeg;type
TsaveBlobtoDBForm = class(TForm)
PageControl1: TPageControl;
TabSheet3: TTabSheet;
ADODS1: TADODataSet;
ADOConnection1: TADOConnection;
ADODS1TITLE: TStringField;
ADODS1TXT: TMemoField;
ADODS1JPEG: TBlobField;
ADODS1BMP: TBlobField;
Label1: TLabel;
DBEdit1: TDBEdit;
DataSource1: TDataSource;
Label2: TLabel;
DBMemo1: TDBMemo;
Label4: TLabel;
savetxt1: TButton;
savejpeg1: TButton;
OpenDialog1: TOpenDialog;
ADODS1EXT: TStringField;
Image1: TImage;
DBNavigator1: TDBNavigator;
Button1: TButton;
procedure savejpeg1Click(Sender: TObject);
procedure savetxt1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
saveBlobtoDBForm: TsaveBlobtoDBForm;implementation{$R *.dfm}procedure TsaveBlobtoDBForm.savejpeg1Click(Sender: TObject);
begin
OPendialog1.Filter:='*.jpg|*.jpg|*.txt|*.txt|*.bmp|*.bmp|*.jpeg|*.jpeg';
if OPendialog1.Execute then
begin
AdoDs1.Open;
AdoDs1.Append;
ADODS1TITLE.AsString:=OPendialog1.FileName;
Try
ADODS1.FieldByName('Ext').AsString:=ExtractFileExt(Opendialog1.FileName);
ADODS1JPEG.LoadFromFile(Opendialog1.FileName);
AdoDs1.Post;
except
AdoDs1.Cancel;
end;
end;
end;procedure TsaveBlobtoDBForm.savetxt1Click(Sender: TObject);
begin
OPendialog1.Filter:='*.txt|*.txt';
if OPendialog1.Execute then
begin
AdoDs1.Append;
ADODS1TITLE.AsString:=OPendialog1.FileName;
ADODS1TXT.LoadFromFile(OPendialog1.FileName);
end;
AdoDs1.Post;
end;procedure TsaveBlobtoDBForm.Button1Click(Sender: TObject);
begin
Try
AdoDs1jpeg.SaveToFile('temp.jpEg');
Image1.Picture.LoadFromFile('temp.jpEg');
except
end;
end;end.
---------------
*.dfmobject saveBlobtoDBForm: TsaveBlobtoDBForm
Left = 205
Top = 107
Width = 544
Height = 375
Caption = 'saveBlobtoDBForm'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 16
object PageControl1: TPageControl
Left = 0
Top = 0
Width = 536
Height = 348
ActivePage = TabSheet3
Align = alClient
TabOrder = 0
object TabSheet3: TTabSheet
Caption = 'TabSheet3'
ImageIndex = 2
object Label1: TLabel
Left = 47
Top = 32
Width = 37
Height = 16
Caption = 'TITLE'
FocusControl = DBEdit1
end
object Label2: TLabel
Left = 48
Top = 72
Width = 26
Height = 16
Caption = 'TXT'
FocusControl = DBMemo1
end
object Label4: TLabel
Left = 344
Top = 152
Width = 29
Height = 16
Caption = 'BMP'
end
object Image1: TImage
Left = 280
Top = 128
Width = 153
Height = 177
Stretch = True
Transparent = True
end
object DBEdit1: TDBEdit
Left = 46
Top = 48
Width = 804
Height = 24
DataField = 'TITLE'
DataSource = DataSource1
TabOrder = 0
end
object DBMemo1: TDBMemo
Left = 48
Top = 92
Width = 185
Height = 89
DataField = 'TXT'
DataSource = DataSource1
TabOrder = 1
end
object savetxt1: TButton
Left = 272
Top = 96
Width = 72
Height = 26
Caption = 'savetxt1'
TabOrder = 2
OnClick = savetxt1Click
end
object savejpeg1: TButton
Left = 376
Top = 96
Width = 75
Height = 26
Caption = 'savejpeg1'
TabOrder = 3
OnClick = savejpeg1Click
end
object DBNavigator1: TDBNavigator
Left = 216
Top = 8
Width = 230
Height = 33
DataSource = DataSource1
TabOrder = 4
end
object Button1: TButton
Left = 32
Top = 224
Width = 73
Height = 25
Caption = 'loadjpeg'
TabOrder = 5
OnClick = Button1Click
end
end
end
object ADODS1: TADODataSet
Active = True
Connection = ADOConnection1
CursorType = ctStatic
CommandText = 'blobDB'
CommandType = cmdTable
Parameters = <>
Left = 292
Top = 171
object ADODS1TITLE: TStringField
FieldName = 'TITLE'
Size = 50
end
object ADODS1TXT: TMemoField
FieldName = 'TXT'
BlobType = ftMemo
end
object ADODS1JPEG: TBlobField
FieldName = 'JPEG'
GraphicHeader = False
end
object ADODS1BMP: TBlobField
AutoGenerateValue = arDefault
FieldName = 'BMP'
end
object ADODS1EXT: TStringField
FieldName = 'EXT'
Size = 10
end
end
object ADOConnection1: TADOConnection
Connected = True
ConnectionString =
'Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initi' +
'al Catalog=DB_0002'
LoginPrompt = False
Provider = 'SQLOLEDB.1'
Left = 188
Top = 251
end
object DataSource1: TDataSource
DataSet = ADODS1
Left = 472
Top = 128
end
object OpenDialog1: TOpenDialog
Filter = '*.jpg|*.jpg|*.txt|*.txt|*.bmp|*.bmp|*.jpeg|*.jpeg'
Left = 484
Top = 179
end
end
procedure TsaveBlobtoDBForm.Button1Click(Sender: TObject);
begin
Try
AdoDs1jpeg.SaveToFile('temp.jpEg');
Image1.Picture.LoadFromFile('temp.jpEg');
except
end;
end;注意:TDBimage只能装入bmp文件,对于*.jpeg文件不能显示,会报错。此外,一定要引用jpeg单元,千万别忘了,或者执行 AdoDs1jpeg.SaveToFile('temp.jpEg');
会报错!祝楼主好运!
procedure TsaveBlobtoDBForm.Button1Click(Sender: TObject);
begin
Try
if ((AdoDs1Ext.AsString='jpg') or (AdoDs1Ext.AsString='jpeg')) then
begin
AdoDs1jpeg.SaveToFile('temp.jpeg');
Image1.Picture.LoadFromFile('temp.jpeg');
end
else
if AdoDs1Ext.AsString='mp3' then
begin
//播放mp3
end
else
if AdoDs1ext.AsString='doc' then
begin
//打开word 文档
end;
except
end;
end;