我要把一个ID号及一个对应附件保存到数据库(即一个文件),数据库表里就两个字段,如何实现,找了半天没有找到。

解决方案 »

  1.   

    一段代码,自己看去吧unit sp;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, FrameModule, DBTables, Menus, DB, Grids, DBGrids;type
      TspFrame = class(TBaseFrame)
        Tableid: TIntegerField;
        Tablespid: TIntegerField;
        Tablevideo: TBlobField;
        Queryid: TIntegerField;
        Queryspid: TIntegerField;
        Queryspnr: TStringField;
        Queryext: TStringField;
        procedure N1Click(Sender: TObject);
        procedure N2Click(Sender: TObject);
        procedure N3Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        constructor Create(AOwner: TComponent); override;
      end;implementationuses
      ht_add, sp_add, DataModule;{$R *.dfm}{ TspFrame }constructor TspFrame.Create(AOwner: TComponent);
    begin
      inherited;
      Query.ParamByName('id').AsInteger := UserId;
      Query.Open;
    end;procedure TspFrame.N1Click(Sender: TObject);
    var
      Stream: TStream;
    begin
      with TspForm.Create(nil) do
      begin
        if ShowModal = mrOk then
          with DM.Query do
          begin
            Close;
            Sql.Clear;
            Sql.Add('declare @i int');
            Sql.Add('select @i = 1 + (select max(spid) from tb_视频 where id=:id)');
            Sql.Add('if @i is null select @i = 1');        Sql.Add('insert into tb_视频 values(:id, ');
            ParamByName('id').AsInteger := UserId;        Sql.Add('@i, ');        Sql.Add(':spnr, ');               //视频内容
            ParamByName('spnr').AsString := Trim(spnrEdit.Text);        Sql.Add(':ext, ');               //文件后缀
            ParamByName('ext').AsString := ext;        Sql.Add(':video)');             //视频文件
            if not FileChanged then
            begin
              ParamByName('video').DataType := ftBlob;
              ParamByName('video').Value := Null;
            end
            else
            begin
              Stream := TFileStream.Create(OD.FileName, fmOpenRead);
              ParamByName('video').LoadFromStream(Stream, ftBlob);
              Stream.Free;
            end;        try
              ExecSql;
              Close;
              inherited;
            except
              MessageDlg('无法增加,可能网络有问题!', mtInformation, [mbOk], 0);
            end;
          end;
        Free;
      end;
    end;procedure TspFrame.N2Click(Sender: TObject);
    var
      Stream: TStream;
    begin
      if Query.Bof and Query.Eof then
        exit;
      with TspForm.Create(nil) do
      begin
        Caption := '修改视频';
        spnrEdit.Text := Query.FieldByName('spnr').AsString;
        Table.Close;
        Table.Filter := 'id=' + IntToStr(UserId) + ' and spid=' + Query.FieldByName('spid').AsString;
        Table.Open;
        if not (Table.FieldByName('video').IsNull) then
        begin
          ext := Query.FieldByName('ext').AsString;
          (Table.FieldByName('video') as TBlobField).SaveToFile(TempFile + ext);
          LookButton.Enabled := True;
        end;
        Table.Close;
        if ShowModal = mrOk then
          with DM.Query do
          begin
            Close;
            Sql.Clear;        Sql.Add('update tb_视频 set');        Sql.Add('spnr=:spnr');               //视频内容
            ParamByName('spnr').AsString := Trim(spnrEdit.Text);        Sql.Add(', ext=:ext');                //.文件后缀
            ParamByName('ext').AsString := ext;        if FileChanged then
            begin
              Sql.Add(', video=:video');        //视频文件
              Stream := TFileStream.Create(OD.FileName, fmOpenRead);
              ParamByName('video').LoadFromStream(Stream, ftBlob);
              Stream.Free;
            end;        Sql.Add('where id=:id and spid=:spid');
            ParamByName('id').AsInteger := Query.FieldByName('id').AsInteger;
            ParamByName('spid').AsInteger := Query.FieldByName('spid').AsInteger;        try
              ExecSql;
              Close;
              inherited;
            except
              MessageDlg('无法修改,可能网络有问题!', mtInformation, [mbOk], 0);
            end;
          end;
        Free;
      end;
    end;procedure TspFrame.N3Click(Sender: TObject);
    begin
      if Query.Bof and Query.Eof then
        exit;
      if MessageDlg('确定删除该视频?', mtConfirmation, mbOkCancel, 0) <> mrOk then
        exit;
      with DM.Query do
      begin
        Close;
        Sql.Clear;
        Sql.Add('delete from tb_视频 where id=:id and spid=:spid');
        ParamByName('id').AsInteger := Self.Query.FieldByName('id').AsInteger;
        ParamByName('spid').AsInteger := Self.Query.FieldByName('spid').AsInteger;
        try
          ExecSql;
          Close;
          inherited;
        except
          MessageDlg('无法删除,可能网络有问题!', mtInformation, [mbOk], 0);
        end;
      end;
    end;end.
      

  2.   

    如果是SQL SERVER 用Image字段,如
    create table FileList(
    ID vachar(20), File image)query1.close;
    query1.sql.text := 'Insert into filelist(id) values('''+edit1.text+''')';
    query1.Execsql;
    query1.close;
    qeury1.requestlive := true;
    query1.sql.text := 'select * from filelist where id='''+edit1.text+'''';
    query1.Open;
    query1.edit;
    TBlobField(query1.fieldbyname('File').loadfromfile('d:\aa.jpg');
    query1.post;TBlobField(query1.fieldbyname('File').savetofile('d:\aaddddddd.jpg');
      

  3.   

    使用table下载该文件是因为使用query下载时,跟缓冲区大小有关.
    而文件大小是不固定的,缓冲区无论开多大,都有可能不满足
    TQuery与缓冲区的问题可能是delphi的一个bug
    如果使用adoquery,不存在次问题