2011-09-23 100 views
-2

Delphi 2010將TSimpleDataset用於多種用途

我正在嘗試將TSimpleDataset用於多種用途。

var 
q: tsimpledataset; 
row: String; 
n: Integer; 
begin 
q:=tsimpledataset.create(nil); 
q.connection:= SQLConnection1 ; 
q.dataset.commandtype:=ctQuery ; 
q.dataset.commandtext:='select lastid from last_id where tablename=:ARow'; 
q.Params.Assign(q.Dataset.Params); 
ShowMessage(q.dataset.commandtext); 
row:='accounts'; 
q.params[0].asstring:= row; 
    q.open; 
if q.isempty then 
    raise exception.create('No matching row found in LAST_ID table.'); 
n:=q.fieldbyname('lastid').asinteger +1; 
q.close; 
q.dataset.commandtype:=ctQuery ; 
q.dataset.commandtext:='update last_id set lastid=22'; 
q.execute; //exception Here! 
end; 

我上q.Execute線以下錯誤:

缺少數據提供商或數據包

似乎是與TSimpleDataset的關閉和它的再利用問題。 它會工作,如果我釋放它並重新創建它,並重新確定屬性和新屬性以將其用於執行。不過,我想不必這樣做。我希望能夠關閉它,然後分配一個新的CommandText並重新使用它。

我研究並閱讀了很多關於互聯網不使用拖車TSimpleDataset的reagrding,而是使用其他三個組件(ClientDataSet,DataSetProvider和SQLDataSet)的其他組件。你會認爲,到2010年,Embarcadero公司已經解決了TSimpleDataset的任何問題。

除了需要翻譯TSimpleDataset之外的其他東西嗎?

謝謝!

+1

我對TSimpleDataSet沒有太多經驗,但通常我根本不會重用數據集。只需將它們放在數據模塊上,儘可能使用IDE進行配置,並且不要編寫所有代碼以重用單個組件,而只能使用兩個組件。他們不會消耗太多的記憶(幾乎沒有),所以不要被這個困擾。 – GolezTrol

+0

對不起,但那不是一個選項。我需要在運行時創建和使用它們,並將它們用於多種用途。 – IElite

+0

TSimpleDataSet不是一個嚴重的組件,你會很快超過它。這是我的猜測,這就是爲什麼英巴卡迪諾可能會忽略它。如果要簡化刪除3組件TClientDataSet,TDataSetProvider,TSQLDataSet的過程,請查看[組件模板](http://delphi.wikia.com/wiki/Creating_Component_Templates) – LachlanG

回答

0

不應該是第二種命令類型。

q.DataSet.CommandType := ctUpdate; 
+0

-1。只有'CommandType'的可能值是'ctQuery','ctTable','ctStoredProc'和'ctServerMethod'。 – JRL

+0

好的注意到'ctUpdate'不包含在'TInternalSQLDataset'使用的子集中。 我注意到,你不清除的參數,這將有助於做一個'q.Params.Clear'? – PeterS

+0

我試過了Paams.clear,它沒有改變。獲取相同的錯誤。 – IElite