2012-06-26 37 views
1

我有一系列刀片要在表中進行了非常大的列數,例如:默認命令paramters插入

INSERT INTO Table1 (A,B,C,...,Z) VALUES (@a,@b,@c,...,@z) 

所有字段(A至Z)可爲空。如果您未能明確設置已寫入命令文本的命令參數,則無法執行插入操作。

由於列名不是真正順序的(都有相當隨機的名稱),有沒有簡單的方法來循環命令文本中的參數並將它們設置爲DBNull.Value?還是我手動寫出來,:

cmd.Parameters.AddWithValue("@a", DBNull.Value); 
cmd.Parameters.AddWithValue("@b", DBNull.Value); 
cmd.Parameters.AddWithValue("@c", DBNull.Value); 
... 
cmd.Parameters.AddWithValue("@z", DBNull.Value); 

或者是建造一列實際上是在使用和一起將它們連接起來(和使用的參數),然後設置使用的參數正確的解決方案?

我傾向於迴避串聯解決方案的查詢以避免潛在的注入攻擊。

回答

4

下面就來設置每個參數設置爲NULL更簡潔/清潔方法:

foreach (var param in new[] { "@a", "@b", ... }) 
    cmd.Parameters.AddWithValue(param, DBNull.Value); 

我也傾向於迴避拼接的解決方案了,但如果你的列已在定義的默認值可能是不同的如果您在insert聲明中明確將它們設置爲空,則會覆蓋該數據庫(?)。

+0

我想說如果我只需要設置@a,剩下的就爲空:我會繼續設置@a。然後執行類似於你的答案的循環,只添加一個檢查,只添加參數爲null,如果命令的參數列表尚未包含該參數。 – user17753

2

是的,你可能會編寫代碼讀取列名並將它們設置爲NULL的缺省值,缺點是需要更高的權限來讀取系統數據庫。

我會強烈建議您考慮書面方式存儲過程一樣,

CREATE PROCEDURE [dbo].[spInsertTable1] 
    @a type = NULL, 
    @b type = NULL, 
    @c type = NULL, 
    -- ... 
    @z type = NULL 
AS 
BEGIN 
    INSERT INTO Table1 (A, B, C, ...., Z) VALUES 
    (@a, @b, @c, ..., @z) 
END 

你可以叫他們像,

command.CommandText = "dbo.spInsertTable1"; 
command.CommandType = CommandType.StoredProcedure; 
command.Paramaters.AddWithValue("@a", somevalue); 
// No more are needed the stored procedure will default them to NULL. 
1

您將需要執行一些對錶,以獲得表首先定義,然後你可以遍歷該定義並構建你的參數。

所以,你可以做一個「選擇表名頂尖0 *」,檢索到一個DataReader,然後通過像這樣的領域循環:

for(int i=0;i<reader.FieldCount;i++) 
{ 
    cmd.Parameters.AddWithValue("@" + reader.GetName(i), DBNull.Value); 
} 

,它假定每個字段相同的表示爲參數。

1

一種解決方案是創建一個存儲您不同的參數名稱的數組,遍歷它給每個人設定的DBNull如果你沒有設置自己的價值,就像這樣:

// Assume paramNames is an array of strings containing each paramter name 
foreach(strign param in paramNames) 
{ 
    // Note: 'SettingValue()' and 'value' are a placeholders, as I don't 
    // know how you're determining which parameters are being used. 
    if(SettingValue(param)) 
    { 
     cmd.Parameters.AddWithValue(param, value); 
    } 
    else 
    { 
     cmd.Parameters.AddWithValue(param, DBNull.Value); 
    } 
} 

我同意避免串聯解決方案。有一件事要問自己:如果你的插入中有太多未使用(可爲空)的參數,爲什麼你首先要使用它們?您應該能夠執行INSERT,而無需包括它們開始。

如果您需要將它們用於將來參考,則可以在數據庫中創建存儲過程,而不是使用參數化查詢,併爲可爲空的參數指定默認值。那麼你只需要指定正在使用的參數。