【问题标题】:How to use Column Names from list into MySql insert如何使用列表中的列名插入 MySql
【发布时间】:2018-01-15 22:08:55
【问题描述】:

我有 2 个列表:

List<string> ColumnNames = new List<string>();
List<string> ValueNames = new List<string>();
ColumnNames = names.Keys.ToList();
ValueNames = names.Values.ToList();

我正在尝试将此列表用于 MySql 语句:

...
MySqlCommand command = conDataBase.CreateCommand();
command.CommandText = string.Format("insert into MyTable {0} values (?parameter)", string.Join(",", ColumnNames));
command.Parameters.AddWithValue("parameter", string.Join(",", ValueNames));
...

这里语法错误

...
command.CommandText = "insert into MyTable (" + string.Join(",", ColumnNames) + ") values ('" + string.Join(",", ValueNames) + "')";
...

...
command.CommandText = "insert into MyTable (" + string.Join(",", ColumnNames) + ") values (?parameter)";
command.Parameters.AddWithValue("parameter", string.Join(",", ValueNames));
...

在最后 2 个代码中,我遇到错误“列计数与第 1 行的值计数不匹配,但是

ColumnNames.Count = ValueNames.Count

【问题讨论】:

  • 您需要自己添加所有参数名称和每个参数映射。请参阅答案stackoverflow.com/a/11905249/7505395 以了解其外观。命令文本中的变量名应以 @ 为前缀 - 在将带有值的参数添加到查询时使用相同的名称。
  • 我也试过了,我也有同样的错误:列数与第 1 行的值数不匹配
  • 我认为变量ColumnNames有问题,Values没有问题,并且list.count在不同的gridviews中会有所不同,所以你给我的示例没有回答问题((

标签: c# sql c#-4.0 sqlparameter


【解决方案1】:

这是,您可以使用另一个问题中提供的答案“编写脚本”:

string tableName = "Person";

// the names of the columns in your table    
var columnNames = new List<string> { "Name", "Age", "BirthDate" };

// the data you want to store in each column
var data = new List<string> { "Klaus", "22", "Before 2010" };

var myColumns = string.Join (", ", columnNames.Select (n => string.Format("[{0}]",n)));
var myParamColumns = string.Join (", ", columnNames.Select (n => string.Format("@{0}",n)));

using (var dbCommand = new SqlCommand() /*conDataBase.CreateCommand ()*/)
{ 
    dbCommand.CommandText = string.Format ("insert into {0}  ( {1} ) values ( {2} );", tableName, myColumns, myParamColumns);

    // your insert now looks like this:
    // insert into Person  ( [Name], [Age], [BirthDate] ) values ( @Name, @Age, @BirthDate );

    Console.WriteLine (dbCommand.CommandText);

    // then you add each single piece of data to each used @....    

    for (int i = 0; i < columnNames.Count; i++)
      dbCommand.Parameters.AddWithValue (columnNames[i], data[i]);

    dbCommand.ExecuteNonQuery ();
}

【讨论】:

  • 谢谢,我觉得最好用:List RevValueNames = new List(); myParamColumns.ForEach(x => RevValueNames.Add("'" + x + "'"));
【解决方案2】:

我找到了解决方案: https://www.codeproject.com/Questions/1225444/How-to-use-column-names-from-list-into-mysql-inser

List<string> ColumnNames = names.Keys.ToList()
List<string> ValueNames = names.Values.ToList();
List<string> RevValueNames = new List<string>();
ValueNames.ForEach(x => RevValueNames.Add("'" + x + "'"));
string Query = string.Format("insert into MyTable ({0}) values ({1})", string.Join(",", ColumnNames), string.Join(",", RevValueNames));
                command.CommandText = Query;

【讨论】:

  • 您应该永远使用用户输入字符串并将它们字符串连接到您的 sql 中。谷歌 Sql 注入。或者想想如果我将它输入到您的一个文本框中会发生什么:'); TRUNCATE MyTable; DROP TABLE MyTable; 使用 SqlParameter 可以防止这种情况发生。
  • 但我别无选择,我有很多表和很多gridviews,我不会为所有这些写1个模块,列名和数量不同
猜你喜欢
  • 1970-01-01
  • 2020-11-09
  • 2018-08-20
  • 1970-01-01
  • 2013-03-26
  • 2017-09-28
  • 2013-04-19
  • 2018-04-07
  • 2013-08-17
相关资源
最近更新 更多