如何将任何文件保存到数据库,然后将它读出保存!

解决方案 »

  1.   

    你是什么数据库?
    用text类型存放不就可以(SYBASE里支持2m)?
    哦,要是图片的有些复杂,不过也可以有 image.
      

  2.   

    管理 ntext、text 和 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
      

  3.   

    使用 Text 和 Image 数据
    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'
      

  4.   

    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;
      

  5.   

    简单,首先 创建一个表:
    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
      

  6.   

    下面这个事件是将jpeg(jpg)文件打开,在image1中显示出来
    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');
    会报错!祝楼主好运!
      

  7.   

    对于其他类型的文件,可像对待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;
      

  8.   

    我做了个例子,可以实现,谁要请留MAIL到我的消息中。