Получение идентификатора строки C# Mysql
Я изменял мой клиент базы данных Mysql на файл mysql.data.dll из System.data.sqlclient.
Но раньше с sqlclient я мог сделать это:
public long insertQuery()
{
long lastInsertedId = 0L;
try
{
lastInsertedId = (long)command.ExecuteScalar();
}
catch (Exception exception)
{
Exeption.WriteMySQLError(exception.ToString());
}
return lastInsertedId;
}
dbClient.setQuery("INSERT INTO items (base_item, user_id) VALUES (" + BaseItem + ", " + UserId + ")");
Id = (uint)dbClient.insertQuery();
и затем я получил itemId, который я только что вставил, но с тем же кодом и с ExecuteScalar() из MySql.Data.MySqlClient.MySqlCommand Я получаю нулевое исключение. так как это работает с MySqlCommand?
Команда исходит из этого:
private MySql.Data.MySqlClient.MySqlCommand Command;
Исправил это благодаря Стиву Heres фиксированный код.
public long insertQuery()
{
Command.CommandText += "; SELECT LAST_INSERT_ID()";
long lastInsertedId = 0L;
try
{
lastInsertedId = Convert.ToInt32(Command.ExecuteScalar().ToString());
}
catch (Exception exception)
{
Console.WriteLine("Nou er is een error in insertquery! :" + exception.ToString());
}
return lastInsertedId;
}
1 ответ
MySql возвращает последний вставленный идентификатор, используя функцию LAST_INSERT_ID
Таким образом, текст вашей команды должен быть изменен на что-то вроде этого
dbClient.setQuery(@"INSERT INTO items (base_item, user_id) VALUES (....);
SELECT LAST_INSERT_ID()");
Id = (uint)dbClient.insertQuery();
Однако ваш код страдает от серьезной проблемы, называемой SQL-инъекцией. Передача сформированных строк, объединяющих фрагменты других строк, делает ваш код уязвимым с точки зрения безопасности и очень простым в использовании.
Прочитайте об SQL-инъекции и о том, как использовать параметризованный запрос.
Краткий рассказ о SQL-инъекциях