2010-09-17 46 views
7

有沒有一種標準的方法來轉換TVarRec和Variant值?如何轉換TVarRec和Variant?

我想分析一個'數組的const'並使用這些值來填充TMSQuery中的參數。爲此,我使用列名稱列表(從TMSQuery.KeyFields生成),並將數組中的值與KeyFields中的列名稱(按位置)進行匹配,然後使用列名稱使用ParamByName設置相應的參數。

下面的代碼是我想到的,但VarRecToVariant似乎不是很優雅。有更好的解決方案嗎?

keyFields: TStringList; 
    // List of table column names (keyFields.DelimitedText := query.KeyFields;) 
    // e.g. Name, Age 
    query: TMSQuery; 
    // Parametrized query with a parameter for each field in keyFields 
    // SELECT * FROM People WHERE Age=:Age AND Name=:Name 

    // If keyValues is ['Bob', 42] the resulting query should be 
    // SELECT * FROM People WHERE Age=42 AND Name='Bob' 

    procedure Read(keyValues: array of const); 
    var 
    i: Integer; 
    name: string; 
    value: Variant; 
    begin 
    ... 
    for i := 0 to keyFields.Count - 1 do 
    begin 
     name := keyFields[i]; 
     value := VarRecToVariant(keyValues[i]); 
     query.ParamByName(name).Value := value; 
    end; 
    query.Open 
    ... 
    end; 

    function VarRecToVariant(varRec: TVarRec): Variant; 
    begin 
    case varRec.VType of 
     vtInteger: result := varRec.VInteger; 
     vtBoolean: result := varRec.VBoolean; 
     vtChar:  result := varRec.VChar; 
     vtExtended: result := varRec.VExtended^; 
     vtString:  result := varRec.VString^; 
     ... 
    end; 
    end; 

注:

  • 常量的數組中的值依賴於在查詢中的參數。調用者知道這些是什麼,但使用該數組的方法不知道有多少或期望的類型。即我無法將方法更改爲Read(name:string; age:integer)。
  • 參數不一定按照在const數組中指定值的順序使用。在該示例中,keyFields被指定爲「Name,Age」,但查詢使用Age之前的Age。這意味着Params [i] .Value:= keyValues [i]將不起作用。我認爲VarRecToVariant仍然是需要的,我試圖避免)。
+0

膠帶永遠不會很漂亮,這基本上就是你在做什麼,加入兩個不同的系統。總會有一些阻抗不匹配。 – 2010-09-17 08:33:48

+1

順便說一句,VCL中已經有一個非常類似的函數:ConvertToVariant in MxCommon unit。 – 2010-09-17 08:58:25

+0

@TOndrej,我不知道ConvertToVariant,謝謝你提到它。 – WileCau 2010-09-17 09:17:24

回答

5

更換

procedure Read(keyValues: array of const); 

procedure Read(keyValues: array of Variant); 

然後,你將不再需要TVarRec轉換爲變體。

+0

感謝這就是我需要的橫向思維:)我在轉換數組的細節上陷入了困境,我沒有想到只是改變數組類型。 – WileCau 2010-09-17 09:31:58

+2

+1在盒子外面思考。 – 2010-09-17 14:19:48

+0

變體不能容納TVarRec可以包含的所有內容。 – 2012-08-31 09:05:31

相關問題