2013-01-15 50 views
0

我對Delphi數據庫組件有問題。我試圖給程序添加一些功能,但遇到了奇怪的問題。我把它分解成一個簡單的示例項目,行爲仍然存在。Delphi數據庫組件的奇怪行爲

我在Delphi 2007上創建了一個新的Forms應用程序,添加了TSQLConnection,TSQLTable,TDataSetProvider和TClientDataSet。我插入用於本地MS SQL數據庫中的信息,這是內部的表,這是一個簡單的測試表:

CREATE TABLE dbo.Test1(
[Name] varchar(32) not null primary key, 
[Type] varchar(16) not null, 
[Selected] BIT not null) 

我然後加入一個TEDIT,和的TListBox 2個按鈕。該功能應該是:按Add(添加),名稱爲Edit1的記錄被輸入到數據庫中。按更新並且列表視圖被填充數據庫中已有的條目。

代碼:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    I: Integer; 
begin 
    ClientDataSet1.Refresh; 
    ClientDataSet1.First; 
    while not ClientDataSet1.Eof do 
    begin 
    ListBox1.AddItem(ClientDataSet1Name.AsString,nil); 
    ClientDataSet1.Next; 
    end; 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
begin 
    ClientDataSet1.Append; 
    ClientDataSet1Name.AsString := Edit1.Text; 
    ClientDataSet1Type.AsString := 'A1'; 
    ClientDataSet1Selected.AsBoolean := false; 
    ClientDataSet1.Post; 
    ClientDataSet1.ApplyUpdates(-1); 
end; 

現在我奇怪的是,啓動該程序時,加2條(管理工作室,他們是真的有檢查),現在我點擊更新後,列表保持爲空,因爲一旦執行Button1Click的開始刷新,ClientDataSet的RecordCount就爲0。然而,條目是並且保留在數據庫中。

另一個奇怪的是,只要我退出程序,並再次啓動並嘗試添加另一條記錄,我收到錯誤「無法創建新的連接,因爲在手動或分佈式事務模式下」。只要我從表中刪除記錄並重新啓動程序,我可以再次添加。

有人可以告訴我這種奇怪的行爲是如何發生的,我該如何解決它?

在此先感謝。

+0

好吧,我發現的第一個問題做搜索結果的LOF如果我在ClientDataSet1.Refresh之前調用SQLTable1.Refresh,則不會發生,但我認爲這是DataSet應該自己做的事情 – Marks

+0

對於刷新,SQLTable1是否在程序啓動時關閉?如果基本數據集是打開它不會再打開它 – jachguate

+0

不,SQLTable1已打開,我檢查了它,並且如果它是clo sed我無法執行刷新,因爲如果表已關閉,則會發生錯誤。 – Marks

回答

0

也許這一個:

「問題:
當使用一個ClientDataSet的和提供的是MSSQL dbExpress驅動程序,不斷收到以下錯誤調用ApplyUpdate時:無法創建,因爲在手動或分佈式事務模式新的連接

建議的解決方法:
將「poFetchDetailsOnDemand」(對於提供程序)設置爲False。將它設置爲True時,這是一個已知問題。

(從this Embarcadero article是指SQLOLEDB Allows Only One Connection in Scope of Transaction引用。

有一個爲「無法創建,因爲在手動或分佈式事務模式新的連接」

+0

poFetchDetailsOnDemand在默認情況下已經是False了。我知道有很多搜索結果,但我已經瀏覽了至少google的第4頁並嘗試過了。沒有任何幫助。 – Marks