2012-07-05 120 views
0

我有一個Tadocommand我datamodule連接到MSSQL storedproc。 storedproc用於更新表格。 在我的代碼中,我將其中一個Tclientdatasets的beforeupdaterecord方法稱爲tadocommand。如何重置德爾福Tadocommand參數

首先,我使用deltads.fieldbyname()提供tadocommand參數的值。然後我調用執行過程Tclientdataset的newvalue。它適用於第一次更新,但如果我嘗試執行下一次更新,則會生成「錯誤更改爲datetime的varchar」。

如果我動態創建即

sp1_editcontract:=Tadocommand.Create(nil); 
sp1_editcontract.CommandType:=cmdStoredProc; 
sp1_editcontract.Connection:=DMDBconn.DBConn; 
sp1_editcontract.CommandText:='EditContract'; 
sp1_editcontract.Parameters.Refresh; 
//assign parameter values 
sp1_editcontract.execute; 
sp1_editcontract.free; 

在beforeupdaterecord方法tadocommand它工作沒有任何錯誤。我認爲在datamodule上使用靜態Tadocommand時,參數值存在一些問題。

爲什麼使用靜態創建的tadocommand而不是動態創建的tadocommand時多重更新會產生錯誤?

+0

任何想法爲什麼它適用於動態創建的tadocommand而不是數據模塊上的 – mem100 2012-07-06 13:49:46

+1

問題更新 – mem100 2012-07-06 15:43:00

+0

您是否正在更改調用之間的命令(要調用的過程名稱)? – jachguate 2012-07-06 17:30:27

回答

0

我打算假設您指的是TDatasetProvider.BeforeUpdateRecord而不是TClientDataSet.BeforeUpdateRecord

從您提供的信息(您沒有指出存儲過程的參數的數據類型或順序)很難說。該錯誤消息來自SQL Server引擎。我會確保分配給參數的值總是按照正確的順序設置。還要嘗試確定哪個參數導致錯誤。如果您可以可靠地在您的客戶端代碼中重現它,則可以嘗試調用SSMS中的存儲過程,以傳遞在客戶端應用程序中導致錯誤的相同值。

確定參數後,您可以檢查其數據類型在ADOCommand,DatasetProvider和ClientDataset之間是否一致。如果它沿着可能導致錯誤的方式改變類型。

最後一個建議,請確保在退出BeforeUpdateRecord處理程序之前設置了TDatasetProvider.Applied := True。這可防止數據集提供程序嘗試在應用更新後使用動態sql應用更新。如果客戶端數據集中的數據由TADOQuery填充,則可能試圖直接更新表。

0

我有一個類似的問題。爲了增加新的一個使用下面的代碼之前清除ADOCommand的所有現有參數:

while Command.Parameters.Count>0 do 
    Command.Parameters.Delete(0); 

Parameters.Clear應該工作過,但它didn't,所以我決定刪除參數逐個。這固定在我身上。