全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1338
推到 Plurk!
推到 Facebook!

UPDATE失效問題

答題得分者是:herbert2
Reiji
初階會員


發表:30
回覆:57
積分:32
註冊:2008-06-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-10-30 14:33:42 IP:61.219.xxx.xxx 訂閱
小弟遇上了一個問題,在DELPHI裡的QUERY給了一個UPDATE的SQL,
執行時開啟SQL MONITOR,並在執行中給予MESSAGE查看執行狀態,
一切正常,且SQL MONITOR中也顯示執行完畢,但卻沒有正確的UPDATE資料!
將該SQL語法COPY到PL/SQL中執行正常,卻能得到預期的結果

不曉得小弟在SQL MONITOR中所看到的執行狀態正常,
是否代表真的執行正常,只是被鬼偷改回去了= =?

以下是SQL MONITOR中顯示的狀態:

[code delphi]
308 14:03:54 SQL Vendor: ORACLE - oopen
309 14:03:54 SQL Vendor: ORACLE - oparse
310 14:03:54 SQL Vendor: ORACLE - obndrvn
311 14:03:54 SQL Execute: ORACLE - update a set A1='Y' where 1=1 AND A2 = 'aaa'
312 14:03:54 SQL Vendor: ORACLE - oexec
313 14:03:54 SQL Data In: ORACLE - Rows affected = 1
314 14:03:54 SQL Stmt: ORACLE - Close
315 14:03:54 SQL Vendor: ORACLE - oclose
316 14:03:54 SQL Transact: ORACLE - XACT Commit
317 14:03:54 SQL Prepare: ORACLE - COMMIT WORK
318 14:03:54 SQL Vendor: ORACLE - oopen
319 14:03:54 SQL Vendor: ORACLE - oparse
320 14:03:54 SQL Execute: ORACLE - COMMIT WORK
321 14:03:54 SQL Vendor: ORACLE - oexec
322 14:03:54 SQL Stmt: ORACLE - Close
323 14:03:54 SQL Vendor: ORACLE - oclose
324 14:03:54 SQL Stmt: ORACLE - Reset
325 14:03:54 SQL Vendor: ORACLE - ocan
326 14:03:54 SQL Prepare: ORACLE - UPDATE b SET b1 = b1-1, b2 = sysdate WHERE b3='aaa'
327 14:03:54 SQL Vendor: ORACLE - oopen
328 14:03:54 SQL Vendor: ORACLE - oparse
329 14:03:54 SQL Vendor: ORACLE - obndrvn
330 14:03:54 SQL Execute: ORACLE - UPDATE b SET b1 = b1-1, b2 = sysdate WHERE b3='aaa'
331 14:03:54 SQL Vendor: ORACLE - oexec
332 14:03:54 SQL Data In: ORACLE - Rows affected = 1
333 14:03:54 SQL Stmt: ORACLE - Close

[/code]


但由delphi執行後b1未 1,b2時間也未改
故一併附上該Query1的程式碼...


[code delphi]
with Query1 do begin
close;
sql.clear;
SQL.add('UPDATE b '
' SET b1 = b1 1,'
' b2 = sysdate '
' WHERE b3=''' Edit.Text ''' ');
execsql;
end;

[/code]

為何沒有
COMMIT WORK???
------
永遠都是新手
編輯記錄
Reiji 重新編輯於 2008-10-30 14:40:47, 註解 無‧
shunaaron
高階會員


發表:13
回覆:94
積分:106
註冊:2006-10-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-10-31 10:53:37 IP:125.34.xxx.xxx 訂閱
SQL.add('UPDATE b SET b1 = b1 1, b2 = ' QuotedSte(sysdate ) ' WHERE b3= ' QuotedStr(trim(Edit.Text)));
你的時間是字串或日期格式吧?
===================引 用 Reiji 文 章===================


但由delphi執行後b1未 1,b2時間也未改
故一併附上該Query1的程式碼...


[code delphi]
with Query1 do begin
close;
sql.clear;
SQL.add('UPDATE b '
' SET b1 = b1 1,'
' b2 = sysdate '
' WHERE b3=''' Edit.Text ''' ');
execsql;
end;

[/code]

為何沒有
COMMIT WORK???
------
程式沒有這麼難
只是還沒打通其中要絕
pprayer
高階會員


發表:35
回覆:185
積分:174
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-10-31 14:04:44 IP:59.120.xxx.xxx 訂閱
補充一下
看Delphi 的SQL Monitor不準,
原因是SQL Monitor觀察的是AP端傳給後端的SQL command
可能那SQL 因為語法錯誤實際上沒有被資料庫執行也不一定
而不是像MS SQL的Profiler那樣顯示有傳回結果的SQL command
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-11-01 00:35:02 IP:211.72.xxx.xxx 訂閱
如果您是使用 BDE, Config 要設 AutoCommit,
否則須於 TQuery->AfterPost() 程式中執行
TQuery->TDataBase->StartTransaction();
TQuery->ApplyUpdates();
TQuery->TDataBase->Commit();
TQuery->CommitUpdates();
編輯記錄
herbert2 重新編輯於 2008-11-01 00:38:37, 註解 無‧
yang1217
一般會員


發表:2
回覆:5
積分:1
註冊:2008-02-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-11-01 21:12:40 IP:122.126.xxx.xxx 訂閱
試一下
with Query1 do

begin

close;
sql.
clear;
SQL.add('UPDATE b SET b1=:b1,b2=:b2');

SQL.add(' WHERE b3=:b3'
);
ParamByName('b1').Value:=b1 1;
ParamByName('b2').Value:=sysdate
ParamByName('b3').Value:=edit.Text;
execsql;
end;

Reiji
初階會員


發表:30
回覆:57
積分:32
註冊:2008-06-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-11-13 09:14:12 IP:61.219.xxx.xxx 訂閱
抱歉!小弟在嘗試之後,發現是沒有commit所致,真是感謝各位提供解決的方法^^
------
永遠都是新手
系統時間:2024-05-06 5:54:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!