按参数更新列名称

时间:2011-09-29 20:03:51

标签: c# .net ado.net

如何通过参数

传递列名

按照示例

DataTable dt = new DataTable();

// Here I fill my datatable

for (int i = 0; i < dt.Rows.Count; i++)
{
     for (int j = 0; j < dt.Columns.Count; j++)
     {
       string columnsname = dt.Rows[i][dt.columns[j].toString()].toString();
       SqlCommand comando = new SqlCommand();
       comando.commandText = "UPDATE Sales.Store SET @columnname = @demographics where id =   @id";
       comando.Parameters.Add(new SqlParameter("@columnname", columname));
       comando.Parameters.Add(new SqlParameter("@dados2", dados2));
       comando.ExecuteNonQuery();
       comando.Clear();
       comando.Dispose()
    } 
}

这不起作用,但我有88列,我需要更新每行中每88列的所有数据。

3 个答案:

答案 0 :(得分:2)

您无法参数化列名称。

要做你想做的事,你需要诉诸dynamic SQL

答案 1 :(得分:0)

好吧,如果你有30,000行,88列,并且你需要更新所有88列,你可能想重新考虑你的数据库模式。

伊泰。

答案 2 :(得分:0)

我找到了一种方法来包含参数化列名的解决方法。我有同样的问题,但想出了一个不同的方式,因为我是唯一使用列名的人,所以我相信这仍然是一个安全的赌注。

            String sqlcomm = "SELECT * FROM Asset WHERE " + assetColName + " = ";
            command.CommandText = sqlcomm + "$assetColValue";

            //command.CommandText = @"SELECT * FROM Asset WHERE $assetColName = '$assetColValue'";
            //command.Parameters.AddWithValue("$assetColName", assetColName);

            command.Parameters.AddWithValue("$assetColValue", assetColValue);

从上面的代码中可以看出。我几乎尝试了你所做的事情,然后我不得不评论出来。然后我将字符串连接在一起,并能够使用我的参数化列名称和值,然后安全地添加该值。然而,列名不是安全的,但这是一种只有我将使用的方法,所以它仍然有点安全。如果您想要更安全但可以了解修复,则可以添加正则表达式。