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

update table(Sybase,Access)

尚未結案
connection
一般會員


發表:5
回覆:8
積分:2
註冊:2005-07-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-11 14:23:37 IP:61.218.xxx.xxx 未訂閱
各位大大, 以下是小妹程式的寫法 procedure TfrmImage.BitBtn1Click(Sender: TObject); var    ImgName:String; begin   ImgName:=Query1.FieldByName('檔案名稱').AsString;  if (not DM_Package.qryRBIMG_P.IsEmpty) then  begin    DM_Package.qryRBIMG_P.SQL.Clear;    DM_Package.qryRBIMG_P.SQL.Add('Select * from RBIMG_P where FNAME='''+ImgName+'''');    DM_Package.qryRBIMG_P.Open;    if DM_Package.qryRBIMG_P.RecordCount >0 then      Application.MessageBox('已有相同的檔名存在資料庫','錯誤視窗',MB_OK);  end;    ==>上面的語法是參考某大大的寫法,語法雖過了,但是在資料庫我已存入了相同檔名,他就是沒有做出判斷,請問大大們,上方的寫法哪有錯誤? qryRBIMG_P是sybase資料表 query1接的是Access的資料表(客戶提供,由odbc連結)     if DM_Package.qryRBIMG_P.State=dsBrowse then  begin    DM_Package.qryRBIMG_P.Edit;    DM_Package.qryRBIMG_P.FieldByName('FNAME').AsString:=Query1.fieldByName('檔案名稱').AsString ;    DM_Package.qryRBIMG_P.Post;  end;    ==>這部份如果我不將qryRBIMG_P.State的狀態做更改,值就無法寫入資料庫,它會秀出此資料表不是輸入或新增的模式,不過上方是我個人的寫法,請問各位大大是否有其他的寫法?         Database1.StartTransaction;   try   query1.Close;   query1.SQL.Clear;   query1.SQL.Add('update 違規資料');   query1.SQL.Add('set 處理=1'); //此為整數型態的欄位   query1.SQL.Add('where 檔案名稱=:檔案名稱');   query1.ParamByName('檔案名稱').AsString:=DM_Package.qryRBIMG_P.FieldByName('FNAME').AsString;   if query1.State=dsBrowse then      query1.Edit;   query1.ExecSQL;   except     showmessage('違規資料更新檔案失敗,請通知系統管理人員!!');     Database1.Rollback;   end;   Database1.Commit;  close;  end;    ==>這部份是做更新的動作,Sybase的資料表(qryRBIMG_P)那部份沒有問題,但是到了Access的部份它語法雖然有過,但是我去檢查資料表,根本沒有任何的變動,也會出現table 僅是read的狀態,請問各位大大,要更新access資料表,我上方的寫法哪兒出了問題?另外它一直顯示此資料表不是新增修修的模式,我加了以下兩句,  if query1.State=dsBrowse then      query1.Edit; 始終不行,各位大大可以指導一下嗎?~~~><
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-11 15:03:09 IP:202.62.xxx.xxx 未訂閱
您好﹗    修改如下﹕
引言:
procedure TfrmImage.BitBtn1Click(Sender: TObject);
var
   ImgName:String;
begin
  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Add('Select * From 資料表 Where 條件﹒﹒﹒');
  Query1.Open;
  //請先确認Query1已經有正确Open﹐如果沒有Open的話﹐可使用以上語法
  ImgName:=Query1.FieldByName('檔案名稱').AsString;
  DM_Package.qryRBIMG_P.Close;
  DM_Package.qryRBIMG_P.SQL.Clear;
  DM_Package.qryRBIMG_P.SQL.Add('Select * from RBIMG_P where FNAME='''+ImgName+'''');
  DM_Package.qryRBIMG_P.Open;
  if Not (DM_Package.qryRBIMG_P.IsEmpty) then
    Application.MessageBox('已有相同的檔名存在資料庫','錯誤視窗',MB_OK);
end;    begin
  if Not (DM_Package.qryRBIMG_P.State In [dsInsert, dsEdit]) then
    begin
      DM_Package.qryRBIMG_P.Edit;
      //此處也請先确認Query1已經有正常Open﹐如果沒有Open的話﹐可參考
      //如上段程式碼中之敘述
      DM_Package.qryRBIMG_P.FieldByName('FNAME').AsString := Query1.fieldByName('檔案名稱').AsString ;
      DM_Package.qryRBIMG_P.Post;
    end
  else
    begin
      ShowMessage('目前資料庫狀態無法修改資料');
    end;
end;    begin
  Database1.StartTransaction;
  try
    query1.Close;
    query1.SQL.Clear;
    query1.SQL.Add('update 違規資料 '); 
    //注意SQL敘述的結尾處要加上空格
    query1.SQL.Add('set 處理=1  '); //此為整數型態的欄位
    //注意SQL敘述的結尾處要加上空格
    query1.SQL.Add('where 檔案名稱 = :檔案名稱');
    //此處也請先确認qryRBIMG_P已經有正常Open﹐如果沒有Open的話﹐可參考
    //如上段程式碼中之敘述
    query1.Params.PramByName('檔案名稱').AsString := DM_Package.qryRBIMG_P.FieldByName('FNAME').AsString;
    //對于資料異動的SQL敘述﹐不用再對資料集元件做判斷狀態的動作
    //直接ExecSQL即可
    query1.ExecSQL;
    Database1.Commit;
  except
    showmessage('違規資料更新檔案失敗,請通知系統管理人員!!');
    Database1.Rollback;
  end;
end;
================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
connection
一般會員


發表:5
回覆:8
積分:2
註冊:2005-07-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-10-12 09:22:12 IP:61.218.xxx.xxx 未訂閱
感謝大大的指導,以上的問題已順利解決,可否再請問, 當我觸發了此bitBtnClick的事件後,它除了會update兩個資料表,另外還會將由Access所撈出來的資料帶回主form.使用者繼續操作當是沒問題,但是如果此時使用者決定按了'取消',請問大大,如何讓原本的資料ROLLBacK回去?
connection
一般會員


發表:5
回覆:8
積分:2
註冊:2005-07-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-12 09:38:58 IP:61.218.xxx.xxx 未訂閱
不好意思, 再請問, if Not (DM_Package.qryRBIMG_P.IsEmpty) then Application.MessageBox('已有相同的檔名存在資料庫','錯誤視窗',MB_OK); end; 在這個判斷裏,我想讓這個form 在這個時候整個關閉掉,但是加了close,卻不知它為什麼關不起來,記憶體會卡住,可否請大大指教? 感激不盡
connection
一般會員


發表:5
回覆:8
積分:2
註冊:2005-07-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-10-12 11:12:31 IP:61.218.xxx.xxx 未訂閱
真的很不好意, 請問大大,之前的問題存取Access資料表,第一筆update沒問題 但是接著再新增第二筆資料後,要再去update Access的table它就沒反應了 我用SQL Explorer去測試,發現用sql語法先 update tablename set colum=1 是ok的,但是要先整個關閉access再去開啟,值才會變更,單是refresh是沒有用的 而且如果之前我沒將access關閉,要再去對table作update,它則會警告有其他使用者正使用,無法做變更的動作,對access,真是不太懂,請教大大,如何解決這個問題? 因為access是客戶提供的資料,無法更換~~~><
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-10-12 11:16:52 IP:202.62.xxx.xxx 未訂閱
您好﹗    
引言: 感謝大大的指導,以上的問題已順利解決,可否再請問, 當我觸發了此bitBtnClick的事件後,它除了會update兩個資料表,另外還會將由Access所撈出來的資料帶回主form.使用者繼續操作當是沒問題,但是如果此時使用者決定按了'取消',請問大大,如何讓原本的資料ROLLBacK回去?
可直接使用資料集元件的Cancel方法配合上游Database元件的Rollback方法﹕
begin
  Query1.Cancel;
  Database1.Rollback;
end;
引言: 不好意思, 再請問, if Not (DM_Package.qryRBIMG_P.IsEmpty) then Application.MessageBox('已有相同的檔名存在資料庫','錯誤視窗',MB_OK); end; 在這個判斷裏,我想讓這個form 在這個時候整個關閉掉,但是加了close,卻不知它為什麼關不起來,記憶體會卡住,可否請大大指教? 感激不盡
如果此Form是Auto-Create Form的話﹐修改如下紅色處試試﹕
procedure TfrmImage.BitBtn1Click(Sender: TObject);
var
   ImgName:String;
begin
  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Add('Select * From 資料表 Where 條件﹒﹒﹒');
  Query1.Open;
  //請先确認Query1已經有正确Open﹐如果沒有Open的話﹐可使用以上語法
  ImgName:=Query1.FieldByName('檔案名稱').AsString;
  DM_Package.qryRBIMG_P.Close;
  DM_Package.qryRBIMG_P.SQL.Clear;
  DM_Package.qryRBIMG_P.SQL.Add('Select * from RBIMG_P where FNAME='''+ImgName+'''');
  DM_Package.qryRBIMG_P.Open;
  if Not (DM_Package.qryRBIMG_P.IsEmpty) then
    begin
      Application.MessageBox('已有相同的檔名存在資料庫','錯誤視窗',MB_OK);
      Form1.Close;
    end;
    //假設此Form的名稱為Form1
end;
================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-10-12 11:31:56 IP:202.62.xxx.xxx 未訂閱
引言: 真的很不好意, 請問大大,之前的問題存取Access資料表,第一筆update沒問題 但是接著再新增第二筆資料後,要再去update Access的table它就沒反應了 我用SQL Explorer去測試,發現用sql語法先 update tablename set colum=1 是ok的,但是要先整個關閉access再去開啟,值才會變更,單是refresh是沒有用的 而且如果之前我沒將access關閉,要再去對table作update,它則會警告有其他使用者正使用,無法做變更的動作,對access,真是不太懂,請教大大,如何解決這個問題? 因為access是客戶提供的資料,無法更換~~~><
您好﹗ 至于更新資料來源的方法﹐可以在Commit方法或Rollback方法之后﹐使用資料集元件重新關閉開啟方法﹐或者是資料集元件的Refresh方法來做刷新動作﹐但執行Refresh的時候資料集元件需要先開啟﹒
begin
  Database1.StartTransaction;
  try
    query1.Close;
    query1.SQL.Clear;
    query1.SQL.Add('update 違規資料 '); 
    //注意SQL敘述的結尾處要加上空格
    query1.SQL.Add('set 處理=1  '); //此為整數型態的欄位
    //注意SQL敘述的結尾處要加上空格
    query1.SQL.Add('where 檔案名稱 = :檔案名稱');
    //此處也請先确認qryRBIMG_P已經有正常Open﹐如果沒有Open的話﹐可參考
    //如上段程式碼中之敘述
    query1.Params.PramByName('檔案名稱').AsString := DM_Package.qryRBIMG_P.FieldByName('FNAME').AsString;
    //對于資料異動的SQL敘述﹐不用再對資料集元件做判斷狀態的動作
    //直接ExecSQL即可
    query1.ExecSQL;
    Database1.Commit;
  except
    showmessage('違規資料更新檔案失敗,請通知系統管理人員!!');
    Database1.Rollback;
  end;
  query1.Close;
  query1.SQL.Text := 'Select * From 違現資料');
  query1.Open;
end;
================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
connection
一般會員


發表:5
回覆:8
積分:2
註冊:2005-07-19

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-10-12 15:11:23 IP:61.218.xxx.xxx 未訂閱
感謝大大的答覆 Form 是Auto-Create沒錯,但是在Form1.Close;之前,如果我不加exit; 則程式碼會持續往下跑,並不會在此直接中斷,除非我放的是halt;但是這個指令會令程式整個退出,並非最好的選擇,只是加了 exit; form1.close; 視窗並不會自己關閉,小妹我還是得按x,它才會關閉,請問是小妹哪弄錯了嗎? //如果此Form是Auto-Create Form的話﹐修改如下紅色處試試﹕ //if Not (DM_Package.qryRBIMG_P.IsEmpty) then //begin //Application.MessageBox('已有相同的檔名存在資料庫','錯誤視窗',MB_OK); // Form1.Close; //end; //假設此Form的名稱為Form1 //end; 另外之前小妹我問的以下這個問題 當我觸發了此bitBtnClick的事件後,它除了會update兩個資料表,另外還會將由Access所撈出來的資料帶回主form.使用者繼續操作當是沒問題,但是如果此時使用者決定按了'取消',請問大大,如何讓原本的資料ROLLBacK回去?可直接使用資料集元件的Cancel方法配合上游Database元件的Rollback方法﹕ begin Query1.Cancel; Database1.Rollback; end; 因為我的取消鍵是在form1,而所有資料的UPDATE全在FORM2,所以回到FORM1的取消加入如下 DM_Package.qryRBIMG_P.Cancel; FrmImage.Query1.Cancel; DM_Package.DB_Package.Rollback ; frmImage.Database1.Rollback; 它會出現'no user transaction is currently in progress ',因為 Database1.StartTransaction 是寫在form2的,後再將資料帶回form1,故取消鍵 也在form1,請問,無法跨form來rollback嗎? 除了直接針對table 下sql語法去delete稍早寫入的資料,是否有更好的方法? 感謝大大的指導
系統時間:2024-07-01 17:51:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!