我有一个简单的数据库,其ID列为主键,INT,AUTO_INCREMENT和名称列。
我试图将值插入数据库并获取ID。这是我的代码的一部分:
using (var connection = new MySqlConnection(...))
{
connection.Open();
var command = connection.CreateCommand();
command.CommandText =
"INSERT INTO `adressbook`.`Person` (`ID`, `Name`)
VALUES (@id, @name);";
var idParameter = new MySqlParameter("id", MySqlDbType.Int32);
idParameter.Direction = ParameterDirection.Output;
idParameter.SourceColumn = "ID";
command.Parameters.Add(idParameter);
command.Parameters.AddWithValue("name", "Test");
command.ExecuteNonQuery();
var id = command.Parameters["id"].Value;
connection.Close();
}
但是,我总是得到NULL作为值,即使我可以看到该值已插入数据库(因此连接设置等都很好)。
我已阅读MySQL Connector/NET Output Parameter Returning NULL和Get the value from Output parameter C#,但如果我将代码更改为
,它仍然无法正常工作var reader = command.ExecuteReader();
reader.Read();
reader.Close();
我已阅读相关帖子Executing MySqlCommand (StoredProcedure) with output parameter,但由于我已使用正确的MySql数据类型,因此无法帮助我。
答案 0 :(得分:1)
只需使用MySql的LAST_INSERT_ID功能。
using (var connection = new MySqlConnection(...))
{
connection.Open();
var command = connection.CreateCommand();
command.CommandText = @"INSERT INTO `adressbook`.`Person` (`Name`) VALUES (@name);
SELECT LAST_INSERT_ID();";
command.Parameters.AddWithValue("@name", "Test");
int result = Convert.ToInt32(command.ExecuteScalar());
.......
}
如您所见,您可以通过一次执行向MySql发送多个命令。 LAST_INSERT_ID函数返回最后一个自动增量值。
但是,在这种情况下,您需要调用ExecuteScalar
而不是ExecuteNonQuery
,因为该命令将返回包含单个值的单行。
顺便说一下,如果您有一个Auto_increment列,那么就不要为该列传递任何内容。