Member 12361495 Ответов: 2

Как использовать имена столбцов из списка в mysql insert


У меня есть 2 списка и я хочу использовать их в параметре вставки mysql:

Что я уже пробовал:

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));
...

Я принимаю ошибку "количество столбцов не соответствует количеству значений в строке 1", но
ColumnNames.Count = ValueNames.Count

CHill60

Каково содержание команды.CommandText после того, как вы сделали этот формат строки и каково содержание строки.Join(",", ValueNames)

Member 12361495

команда.CommandText = вставить в msoflioqveknebisklasifikatori (cifruliKodi,dasaxeleba,sruliDasaxeleba,KodiAlfa2,KodiAlfa3) значения (', ,,')
Содержимое ValueNames - это массив строк

2 Ответов

Рейтинг:
5

Richard Deeming

NB: Убедитесь, что ваши имена столбцов не могут быть предоставлены пользователем, иначе вы оставите себя открытым для SQL-инъекция[^].

Что-то вроде этого должно сработать:

command.CommandText = string.Format("INSERT INTO MyTable ({0}) VALUES (?{1})", 
    string.Join(",", names.Keys), 
    string.Join(",?", names.Keys));

// Eg: "INSERT INTO MyTable (col1, col2) VALUES (?col1, ?col2)"

foreach (KeyValuePair<string, string> pair in names)
{
    command.Parameters.AddWithValue(pair.Key, pair.Value);
}


Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]


Рейтинг:
15

Altaf Ansari

попробовать это :

 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;


Member 12361495

да!!!, большое вам спасибо
есть небольшая ошибка, вместо {0} должно быть ({0}).
Спасибо

Altaf Ansari

Да, я пересмотрел свой ответ..