線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1159
推到 Plurk!
推到 Facebook!

ADODataset not in Edit model

答題得分者是:hagar
zzmbeyond01
中階會員


發表:98
回覆:167
積分:53
註冊:2003-09-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-06-28 12:10:28 IP:222.183.xxx.xxx 未訂閱
大大好: 我在利用blobstream把图片添加到数据库中,为什么报数据集没有处于编辑模式i? 多谢大大费心了。。     
 
var
  BmpDlg: TOpenPictureDialog;
  ADOBlobStream: TADOBlobStream;
begin
//设置(更新/添加)的图片
//打开对话框,选择图形bmp
//利用dataset保存至数据库
  bmpDlg := TOpenPictureDialog.Create(nil);
  try
    bmpDlg.Filter := 'BitMap  (*.bmp)|*.BMP';
    bmpDlg.InitialDir := '.\image';
    if bmpDlg.Execute then
    begin
      if ADODataset1.FieldbyName('OBJBMP').IsBlob then
      begin
        ADODataset1.Edit;
        ADOBlobStream := TADOBlobStream.Create(TBlobField(ADODataset1.FieldbyName('OBJBMP')), bmwrite);
        try
          ADOBlobStream.LoadFromFile(bmpDlg.FileName);              TBlobField(ADODataset1.FieldByName('OBJBMP')).LoadFromStream(ADOBlobStream);
          ADODataset1.Post;
        finally
          ADOBlobStream.Free; 报错未处于编辑状态 
        end;
      end;
    end;
  finally
    bmpDlg.Free;
  end;
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-06-28 16:37:34 IP:218.80.xxx.xxx 未訂閱
 
var
  BmpDlg: TOpenPictureDialog;
  ADOBlobStream: TADOBlobStream;
begin
//设置(更新/添加)的图片
//打开对话框,选择图形bmp
//利用dataset保存至数据库
  bmpDlg := TOpenPictureDialog.Create(nil);
  try
    bmpDlg.Filter := 'BitMap  (*.bmp)|*.BMP';
    bmpDlg.InitialDir := '.\image';
    if bmpDlg.Execute then
    begin
      if ADODataset1.FieldbyName('OBJBMP').IsBlob then
      begin
       ADODataset1.Active:=True;
        ADODataset1.Edit;
        ADOBlobStream := TADOBlobStream.Create(TBlobField(ADODataset1.FieldbyName('OBJBMP')), bmwrite);
        try
          ADOBlobStream.LoadFromFile(bmpDlg.FileName);              TBlobField(ADODataset1.FieldByName('OBJBMP')).LoadFromStream(ADOBlobStream);
          ADODataset1.Post;
        finally
          ADOBlobStream.Free; 报错未处于编辑状态 
        end;
      end;
    end;
  finally
    bmpDlg.Free;
  end;
zzmbeyond01
中階會員


發表:98
回覆:167
積分:53
註冊:2003-09-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-06-28 18:10:15 IP:222.183.xxx.xxx 未訂閱
引言:
 
var
  BmpDlg: TOpenPictureDialog;
  ADOBlobStream: TADOBlobStream;
begin
//设置(更新/添加)的图片
//打开对话框,选择图形bmp
//利用dataset保存至数据库
  bmpDlg := TOpenPictureDialog.Create(nil);
  try
    bmpDlg.Filter := 'BitMap  (*.bmp)|*.BMP';
    bmpDlg.InitialDir := '.\image';
    if bmpDlg.Execute then
    begin
      if ADODataset1.FieldbyName('OBJBMP').IsBlob then
      begin
//******************************
//不行啊,数据集本来就是处于激活状态的
        ADODataset1.Active:=True;  
        ADODataset1.Edit;
        ADOBlobStream := TADOBlobStream.Create(TBlobField(ADODataset1.FieldbyName('OBJBMP')), bmwrite);
        try
          ADOBlobStream.LoadFromFile(bmpDlg.FileName);              TBlobField(ADODataset1.FieldByName('OBJBMP')).LoadFromStream(ADOBlobStream);
          ADODataset1.Post;
        finally
          ADOBlobStream.Free; 报错未处于编辑状态 
        end;
      end;
    end;
  finally
    bmpDlg.Free;
  end;
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-06-28 18:21:53 IP:202.39.xxx.xxx 未訂閱
您己經執行了 Post 動作才執行 ADOBlobStream.Free; 的動作 所以先執行 ADOBlobStream.Free; 的動作再做 Post 的動作 -- Everything I say is a lie. 發表人 - hagar 於 2004/06/28 18:23:42
zzmbeyond01
中階會員


發表:98
回覆:167
積分:53
註冊:2003-09-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-06-28 19:31:57 IP:222.183.xxx.xxx 未訂閱
多谢Hagar大大!程序运行成功了! 有一点不明白:为什么先執行 ADOBlobStream.Free; 的動作再做 Post 的動作?     
 
ADODataset1.Edit;
        ADOBlobStream := TADOBlobStream.Create(TBlobField(ADODataset1.FieldbyName('OBJBMP')), bmwrite);
        try
          ADOBlobStream.LoadFromFile(bmpDlg.FileName);
          TBlobField(ADODataset1.FieldByName('OBJBMP')).LoadFromStream(ADOBlobStream);
        finally
        //BlobStream释放以后,数据集才可以post
          ADOBlobStream.Free;
          ADODataset1.Post; 
        end;
      end;
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-06-28 20:06:23 IP:202.39.xxx.xxx 未訂閱
看了一下 Source 在 TADOBlobStream 的 Destroy procedure 中 執行了 FDataSet.SetFieldData(FField, @FData); 再看 SetFieldData procedure 的內容 有這麼一行: if not (State in dsWriteModes) then DatabaseError(SNotEditing, Self); 最後看 dsWriteModes 的內容: dsWriteModes = [dsEdit, dsInsert, dsSetKey, dsCalcFields, dsFilter, dsNewValue, dsInternalCalc]; 相信您應該了解為什麼要先執行 ADOBlobStream.Free; 後再執行 Post 的動作了 -- Everything I say is a lie.
系統時間:2024-11-22 18:33:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!