update table(Sybase,Access) |
尚未結案
|
connection
一般會員 發表:5 回覆:8 積分:2 註冊:2005-07-19 發送簡訊給我 |
各位大大,
以下是小妹程式的寫法
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 發送簡訊給我 |
您好﹗ 修改如下﹕
引言:================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================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 發送簡訊給我 |
|
connection
一般會員 發表:5 回覆:8 積分:2 註冊:2005-07-19 發送簡訊給我 |
|
connection
一般會員 發表:5 回覆:8 積分:2 註冊:2005-07-19 發送簡訊給我 |
真的很不好意,
請問大大,之前的問題存取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 發送簡訊給我 |
您好﹗
引言: 感謝大大的指導,以上的問題已順利解決,可否再請問, 當我觸發了此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 發送簡訊給我 |
引言: 真的很不好意, 請問大大,之前的問題存取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 發送簡訊給我 |
感謝大大的答覆
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稍早寫入的資料,是否有更好的方法?
感謝大大的指導
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |