获取ID(主键)的输出参数

时间:2014-10-03 19:00:03

标签: c# mysql mysql-connector connector-net

我有一个简单的数据库,其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 NULLGet the value from Output parameter C#,但如果我将代码更改为

,它仍然无法正常工作
var reader = command.ExecuteReader();
reader.Read();
reader.Close();

我已阅读相关帖子Executing MySqlCommand (StoredProcedure) with output parameter,但由于我已使用正确的MySql数据类型,因此无法帮助我。

1 个答案:

答案 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列,那么就不要为该列传递任何内容。