2012-06-26 39 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,而无需包括它们开始。

如果您需要将它们用于将来参考,则可以在数据库中创建存储过程,而不是使用参数化查询,并为可为空的参数指定默认值。那么你只需要指定正在使用的参数。