1

我有一个简单的数据库,它有一个 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 数据类型。

4

1 回答 1

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

于 2014-10-03T19:08:05.553 回答