2013-02-12 118 views
-1

我使用2 TADOConnection運行一個小型數據庫應用程序到我的SQL Server。第一個連接僅用於使用ADOTable,DatasourceDBNavigator進行查看。 第二連接在運行時使用下面的代碼ADO使用Delphi和SQL Server無法識別數據庫更改

aConnection:=TADOConnection.create(nil); 

aTable:= TADOTable.create(nil); 
aConnection.LoginPrompt := false; 

..... 
aTable.Edit; 

aTable.Insert; 

aTable.FieldByName(' ... ').AsInteger := .... ; 

aTable.FieldByName(' .... ').AsString := ... ; 

aTable.FieldByName(' .... ').AsString := ..... ; 

aTable.Post; 

aTable.active := false; 

aConnection.connected :=false; 

aTable.free; 

aConnection.free; 

如果我插入與此代碼記錄我看不到改變的數據,如果我按更新導航按鈕創建。我需要重新啓動我的應用程序以查看所有新插入的數據。 爲什麼第一個dbconnection不能識別我的第二個連接所做的更改?

+4

很簡單,如果我按照您的意見沒有新的記錄將被插入了,也是先插入和第二步表到編輯模式並沒有幫助 – whosrdaddy 2013-02-13 08:10:23

回答

3

試試這個,如果我重新正確的話,舊版Delphi/Adoverions中有一個問題,刷新不能按預期工作,而重新查詢卻沒有問題。

procedure TForm2.DBNavigator1Click(Sender: TObject; Button: TNavigateBtn); 
begin 
    if Button = nbRefresh then 
    BEGIN 
    if Assigned(TDBNavigator(Sender).DataSource) then 
     if Assigned(TDBNavigator(Sender).DataSource.DataSet) then 
     if TDBNavigator(Sender).DataSource.DataSet is TCustomAdoDataset then 
      TADODataSet(TDBNavigator(Sender).DataSource.DataSet).Requery; 
    END; 
end; 
+0

這個解決方案是由問題解決的,是XE3和ADO帶來的這個bug嗎? – user1769184 2013-02-19 08:21:45

+0

這不是一個ADO錯誤,我也有D7這個問題。 – bummi 2013-02-19 13:41:12

3

你有一個Edit,緊接着一個Insert。這意味着你的編輯不會改變任何東西(所以沒有改變可以看到),並且你所有的代碼實際上都在更新一個新創建的行。換句話說,你告訴數據庫你想用Edit來更改數據,立即告訴它「我想添加一個新行」(這意味着沒有數據被Edit改變),然後修改新添加的值行。你也應該使用一個TADOConnection

aTable.Edit; 

aTable.Insert; 

只要刪除aTable.Insert;,你應該沒問題。

// Change a row that already exists. 
aTable.Edit; 
aTable.FieldByName(' ... ').AsInteger := .... ; 
aTable.FieldByName(' .... ').AsString := ... ; 
aTable.FieldByName(' .... ').AsString := ..... ; 
aTable.Post; 

根據您對我的回答的評論,看起來您希望實際添加一個新行。在這種情況下,只需使用Insert而不需要Edit(插入新行會自動將您置於更改數據的模式;您不需要單獨調用Edit)。

aTable.Insert; 
aTable.FieldByName(' ... ').AsInteger := .... ; 
aTable.FieldByName(' .... ').AsString := ... ; 
aTable.FieldByName(' .... ').AsString := ..... ; 
aTable.Post; 

Edit改變當前行,而Insert在當前位置添加一個新行(可能改變基於所使用的指數後),Append在數據集的末尾添加一個新行(再次,這可能會根據使用的索引而改變)。

+0

* *更改**數據,而不是*添加新行*。如果你想添加一個新行,刪除'Edit'並使用'Insert'。 – user1769184 2013-02-12 23:18:46

+1

你問到不使用2個adoconnections ... – 2013-02-12 23:22:43

+0

上面的代碼是我的應用程序的第二種形式。我關閉表單,不管我在主窗體上的dbnavigator上按什麼,更改/新插入的記錄都不會顯示。關閉應用程序並重新開始...顯示記錄。 – user1769184 2013-02-12 23:36:36