本人初學,采用DBGRID DataSource ADOQuery ADOConnection 連接mysql資料庫,資料庫連接正常,查詢正常,修改資料時出現問題(部分代碼如下),在xp下用ADOQuery1.Open;ADOQuery1.edit..... ADOQuery1.Post;正常,能成功修改資料,但在win7下出錯,提示“資料提供程式或其他服務回傳 E_FAIL狀態”,修改ADOQuery locktype后,win7下不提示錯誤,但程式執行時DBGRID顯示資料已經修改了,用select * from 重繪資料后發現資料并未修改。使用{}內代碼時win7下正常,也能成功修改資料。請問大師們,如何在win7下使用ADOQuery1.Open;ADOQuery1.edit..... ADOQuery1.Post 成功修改資料。
部分代碼如下:
if edit1.Text<>'' then
begin
Memo1.Lines.Add('');
Memo1.Lines.Add('高頻模塊');
IdIcmpClient1.Host:=Edit1.Text;
IdIcmpClient1.ReceiveTimeout:=1000;
Button1.Enabled:=false;
try
for i:=0 to 1 do
begin
IdIcmpClient1.Ping;
if (IdIcmpClient1.ReplyStatus.BytesReceived =0) or (IdIcmpClient1.ReplyStatus.TimeToLive =0) then
begin
with ADOQuery1 do
begin
{ ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:='Update cbat SET 狀態1="0" where id='+idh ;
ADOQuery1.ExecSQL;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from cbat order by id ');
ADOQuery1.Open;
ADOQuery1.Locate('id',strtoint(idh),[loPartialKey]);
ADOQuery1.EnableControls;
}
ADOQuery1.Open;
ADOQuery1.edit;
ADOQuery1.FieldByName('狀態1').value:='0';
ADOQuery1.Post;
end;
end
else
begin
with ADOQuery1 do
begin
{ ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:='Update cbat SET 狀態1="1" where id='+idh ;
ADOQuery1.ExecSQL;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from cbat order by id ');
ADOQuery1.Open;
ADOQuery1.Locate('id',strtoint(idh),[loPartialKey]);
ADOQuery1.EnableControls;
}
ADOQuery1.Open;
ADOQuery1.Edit;
ADOQuery1.FieldByName('狀態1').value:='1';
ADOQuery1.Post;
end;
end;
Application.ProcessMessages;
end;
finally
Button1.Enabled:=true;
end;
end;
uj5u.com熱心網友回復:
忘了說了 是用delphi7開發的uj5u.com熱心網友回復:
能不能和win7系統有關uj5u.com熱心網友回復:
估計沒關系 我這也有win7 完全沒問題uj5u.com熱心網友回復:
多次嘗試 無效,望高手指點迷津uj5u.com熱心網友回復:
基本上可以確定 post只能修改ADOQuery的表,沒有修改資料庫uj5u.com熱心網友回復:
windows7失敗啊.運行不了uj5u.com熱心網友回復:
你的陳述句中只是修改第一條資料的'狀態1',而不是指定ID的那行資料'狀態1'uj5u.com熱心網友回復:
Adoquery1.UpdateBatch(arall); 用這個試試uj5u.com熱心網友回復:
ADOQuery1.SQL.Text:='Update cbat SET 狀態1="0" where id='+idh ;狀態1="0"應該是狀態1=‘’0‘’
0兩側分別用兩個單引號
另外,
with ADOQuery1 do
begin
ADOQuery1.Close; //ADOQuery1可以省略
Close;//這樣寫即可,with..do陳述句的目的就是為了省略
......
end;
uj5u.com熱心網友回復:
locktype選擇的是什么!!!uj5u.com熱心網友回復:
看一下資料集是否已經修改了。另外價格updatebatch(arall)試試uj5u.com熱心網友回復:
通過ADOConnection連接資料庫,都 需要SQL進行更新操作,資料集的Post陳述句,只能更新 DBGrid的資料。uj5u.com熱心網友回復:
如果用了快取資料模式,需要使用快取模式提交,Post提交只是提交到快取,不會提交到資料庫的,要提交到資料庫,需要有ApplyUpdate等之類的函式uj5u.com熱心網友回復:
簡單看了下一、沒看出來你的 for 起了什么作用,你沒有定位行,也許我看的不仔細;
二、資料庫欄位盡量不要用中文;
三、WIN7的有些設定和XP是不一樣的,比如日期格式就會造成整個軟體崩潰;
四、adoquery除了查詢陳述句等必須設定外,不要修改諸如locktype等任何設定;
五、注意你的查詢陳述句,聯合查詢結果在不同的環境下會有不同的效果,如果你想直接編輯資料,盡量避免聯合查詢,包括聯合查詢的視圖。
uj5u.com熱心網友回復:
用ado.UpdateBatch(arall);uj5u.com熱心網友回復:
POS貌似只會更新DBGRID,試試applyupdates看看uj5u.com熱心網友回復:
在OPEN后加一句FIRST,即:With ADOQuery1 do
begin
Open;
First;
Edit;
.....
Post;
end;
uj5u.com熱心網友回復:
謝謝各位老師,近段時間忙,先暫時用UPDATE方式來做,抽空驗證老師們的建議uj5u.com熱心網友回復:
我已經徹底放棄POST了,感覺這個絕對有BUG,用測驗專案單獨測驗,很好用,一加到系統中,就問題百怪,搜盡網上的方法,基本沒有可用的,簡直瘋了,干脆不用。uj5u.com熱心網友回復:
回傳 E_FAIL狀態 的原因,基本上是 ADO 驅動 OLEDB 有問題,建議通過安裝 MYSQL 的 ODBC ,再通過 ODBC 去連接。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/44379.html
標籤:語言基礎/算法/系統設計
上一篇:不會編程,不小心碰了這個
下一篇:Delphi著作權糾紛問題
