2011-01-31 71 views
1

我一直在用這個把我的頭撞在桌子上。我有一個簡單的表2列,就像這樣:如何在Delphi 2006中運行時使用ADO參數?

CREATE TABLE [dbo].[MiscInitializers](
[PKey] [int] IDENTITY(1,1) NOT NULL, 
[Value] [text] NULL, 
CONSTRAINT [PK_MiscInitializers] PRIMARY KEY CLUSTERED 
(
[PKey] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

我想用這樣的方法來更新行:

function TdmSQL.SetInitializer(Value: string; var Key: string): boolean; 
const 
    UpdateCmd = 
    'update MiscInitializers set Value = :theValue where PKey = :theKey'; 
    InsertCmd = 'insert into MiscInitializers (Value) values (:Param1)'; 
var 
    tmp: integer; 
    rsTmp: TADODataSet; 
    foo: TParameter; 
    sTmp: string; 
begin 
    Result := false; 
    adoGenericCommand.CommandText := ''; 
    adoGenericCommand.Parameters.Clear; 
    if Key <> '' then 
    begin 
    // attempt update 
    if not TryStrToInt(Key, tmp) then 
     exit; 
    adoGenericCommand.CommandText := UpdateCmd; 
    adoGenericCommand.Prepared := true; 
    adoGenericCommand.Parameters.Refresh; 
    // some debug stuff 
    sTmp := Format('Num Params: %d', [adoGenericCommand.Parameters.Count]); 
    ShowMessageBox(sTmp); 
    for tmp := 0 to adoGenericCommand.Parameters.Count - 1 do 
    begin 
     sTmp := Format('Param %d: Name %s', 
     [tmp, adoGenericCommand.Parameters.Items[tmp].Name]); 
     ShowMessageBox(sTmp); 
    end; 
    // end debug stuff 
    foo := adoGenericCommand.Parameters.ParamByName('theValue'); 
    foo.Value.AsString := Value; 
    foo := adoGenericCommand.Parameters.ParamByName('theKey'); 
    foo.Value := Key; 
    rsTmp.Recordset := adoGenericCommand.Execute; 
    Result := rsTmp.RecordCount = 1; 
    exit; 
    // etc 

我看到的情況(與調試消息框調用)是更新命令獲取2個參數,但它們的名稱是Param1和Param2,而不是theValue和theKey。

有沒有辦法在運行時設置參數,所以ParamByName調用將使用我真正想要的名稱,而不是我得到的Param * N *?

回答

0

在分配'CommandText'後,不要在'參數'上調用Refresh。當你調用'刷新'時,VCL會轉向提供者以獲取參數信息,如果返回的信息不包含參數名稱,那麼VCL將立即構成它們。

+0

你的建議是不正確。當我刪除對「刷新」的調用時,我根本沒有得到任何參數(即adoGenericCommand.Parameters.Count = 0)。 – wades 2011-02-01 14:54:01

+0

@wades - 奇怪,「Param」樣式參數應該在分配'CommandText'時初始化。正如我所說,'刷新'從提供商檢索參數信息..你的'參數檢查'是不是每個機會都是錯誤的? – 2011-02-01 15:39:51

2

您可以使用ParseSQL生成參數

const 
    UpdateCmd = 'update MiscInitializers set Value = :theValue where PKey = :theKey'; 
var 
    ds: TADODataSet; 
    I: Integer; 
begin 
    ds := TADODataSet.Create(nil); 
    try 
     ds.CommandText := UpdateCmd; 
     ds.Parameters.ParseSQL(ds.CommandText, True); 
     for I := 0 to ds.Parameters.Count - 1 do 
      ShowMessage(ds.Parameters.Items[I].name); 
    finally 
     ds.Free; 
    end; 
end; 
相關問題