2012-10-16 28 views
3

在我的代碼,我重複這樣的代碼塊的所有時間:用C#中可變數量的參數調用GetStoredProcCommand?

var returnData = MyDb.ExecuteDataSet(
    MyDb.GetStoredProcCommand("MyTable_Insert", columnOne, columnTwo, columnThree), 
    transaction 
); 

var returnId = (int)returnData.Tables[0].Rows[0]["INSERTED_ID"]; 

在我看來這是一個代碼相當大段要重複很多次,但我不知道如何將其推廣到一個方法中,因爲參數的數量與每個存儲過程不同。

顯而易見的解決方案(我)是通過通過我的參數給函數在一個數組,然後展開他們叫GetStoredProcCommand,但我不能找到一個方法來做到這一點:

private int CallStoredProcedure(string procName, List<dynamic> parameterValues) { 
    .. 
    MyDb.GetStoredProcCommand(procName, expand parameterValues); 
    // ERROR: Obviously "expand" doesn't exist 
    .. 
} 

我可以用傳遞使用AddInParameter參數不再囉嗦的方式,但我需要與參數值一起傳遞類型信息:

private int CallStoredProcedure(string procName, IDictionary<DbType, IDictionary<string, string>> paramsKeyValuesByType) { 
    .. 
    MyDb.AddInParameter(myProcCommand, param.Value.Key, param.Key, param.Value.Value); 
    .. 
} 

但後來我不得不調用方法之前構建IDictionary對象這將比我原來的程序更加冗長。

任何人都可以想到一個優雅的解決方案呢?

+0

,你爲什麼不只是使用可變參數,以及在'CallStoredProcedure'?變量參數存儲在一個數組中,可以直接傳遞而不是展開列表。 – mellamokb

+0

你確定你的意思是'dynamic'而不是'object'嗎? –

回答

4

可以使用params關鍵字:如果您使用的是`MyDb.GetStoredProcCommand`可變參數

private int CallStoredProcedure(string procName, params object[] parameterValues) { 
    .. 
    MyDb.GetStoredProcCommand(procName, parameterValues); 
    .. 
} 
+0

我不認爲這對我有幫助,因爲我如何將這些變量參數傳遞給'GetStoredProcCommand' - 是不是必須使用'params'關鍵字來定義?我無法以這種方式工作。我很高興能夠糾正。 –

+2

@RobinWinslow:你不需要做任何事情。檢查[文檔](http://msdn.microsoft.com/en-us/library/bb748722(v = pandp.31).aspx)。正如你所看到的,'GetStoredProcCommand'也使用'params',所以它應該可以工作。你爲什麼認爲這不起作用?你試過了嗎?你得到了什麼錯誤? –

+0

好點。這整個'params'事情讓我有點困惑,但現在我明白了。 –