无法保存一些字段和图像

时间:2014-03-29 01:12:32

标签: delphi delphi-7

我尝试使用此代码来保存一些字段和图像。 我使用MySQL和zzeos连接数据库。

如何修复此代码?

procedure Tfbiodata.btnSaveClick(Sender: TObject);
var
  gambar : TMemoryStream;
begin
  if (edtnis.Text='') or (edtname.Text='') or (cmbjk.Text='') or (edtempat.Text='') or (edtgl.Text='') or (cmbtingkatan.Text='') then
  begin
    ShowMessage('Maaf !!! Data Anda Belum Lengkap ....');
    exit;
  end;
  begin
    zbiodata2.Open;
    zbiodata2.Append;
    zbiodata2.FieldByName('NIS').AsString := edtnis.Text;
    zbiodata2.FieldByName('Nama_siswa').AsString := edtname.Text;
    zbiodata2.FieldByName('Jenis_kelamin').AsString := cmbjk.Text;
    zbiodata2.FieldByName('Tempat_lahir').AsString :=  edtempat.Text;
    zbiodata2.FieldByName('Tanggal_lahir').AsString  := edtgl.Text;
    zbiodata2.FieldByName('Tingkatan').AsString :=  cmbtingkatan.Text;
    zbiodata2.FieldByName('Hasil_indentifkasi').AsString := lblhasil.Caption;
    zbiodata2.FieldByName('Metode_pembeaaran').AsString := memo1.Text;
    try
      convertobmp(openpicture.FileName);
      gambar := TMemorystream.Create;
      image1.Picture.Graphic.SaveToStream(gambar);
      zbiodata2.SQL.Text := 'insert into biodata (gambar) values (:p0)';
      zbiodata2.Params[0].LoadFromStream(gambar,ftBlob);
      zbiodata2.Post;    
      zbiodata2.ExecSQL;
    except
      on E:Exception do
        ShowMessage('sorry this a problem .' + #13 + 'Error : ' + E.Message);
    end;
  end;
end;

当我运行此代码时,我收到错误"抱歉这是一个问题。错误:列表索引超出范围(2)"

1 个答案:

答案 0 :(得分:1)

调用image1.Picture.Graphic.SaveToStream(gambar)后,将gambar.Position设置回0,然后再调用zbiodata2.Params[0].LoadFromStream(gambar,ftBlob)

image1.Picture.Graphic.SaveToStream(gambar);
gambar.Position := 0; // <-- add this
zbiodata2.Params[0].LoadFromStream(gambar,ftBlob);

话虽如此,您正在同时使用zbiodata2进行两个不同的操作 - 编辑正在追加的新行并执行SQL语句。不要那样做!为每个操作使用单独的组件。

如果将图像保存到正在追加的同一行中,则根本不要执行单独的SQL INSERT语句。将图像数据直接保存到行的gambar TField中,然后调用zbiodata2.Post()

procedure Tfbiodata.btnSaveClick(Sender: TObject);
var
  gambar : TStream;
begin
  if (edtnis.Text='') or (edtname.Text='') or (cmbjk.Text='') or (edtempat.Text='') or (edtgl.Text='') or (cmbtingkatan.Text='') then
  begin
    ShowMessage('Maaf !!! Data Anda Belum Lengkap ....');
    Exit;
  end;

  try
    convertobmp(openpicture.FileName);

    zbiodata2.Open;
    zbiodata2.Append;
    try
      zbiodata2.FieldByName('NIS').AsString := edtnis.Text;
      zbiodata2.FieldByName('Nama_siswa').AsString := edtname.Text;
      zbiodata2.FieldByName('Jenis_kelamin').AsString := cmbjk.Text;
      zbiodata2.FieldByName('Tempat_lahir').AsString :=  edtempat.Text;
      zbiodata2.FieldByName('Tanggal_lahir').AsString  := edtgl.Text;
      zbiodata2.FieldByName('Tingkatan').AsString :=  cmbtingkatan.Text;
      zbiodata2.FieldByName('Hasil_indentifkasi').AsString := lblhasil.Caption;
      zbiodata2.FieldByName('Metode_pembeaaran').AsString := memo1.Text;

      if (image1.Picture.Graphic <> nil) and (not image1.Picture.Graphic.Empty) then
      begin
        gambar := TMemoryStream.Create;
        try
          image1.Picture.Graphic.SaveToStream(gambar);
          gambar.Position := 0;
          (zbiodata2.FieldByName('gambar') as TBlobField).LoadFromStream(gambar);
        finally
          gambar.Free;
        end;

        {
        Alternatively:

        gambar := zbiodata2.CreateBlobStream(zbiodata2.FieldByName('gambar'), bmWrite);
        try
          image1.Picture.Graphic.SaveToStream(gambar);
        finally
          gambar.Free;
        end;
        }
      end;

      zbiodata2.Post;    
    except
      zbiodata2.Cancel;
      raise;    
    end;
  except
    on E:Exception do
      ShowMessage('sorry this a problem .' + #13 + 'Error : ' + E.Message);
  end;
end;

如果您在此之后仍然遇到问题,则需要解释实际出现的问题,您看到的错误等等。