MySql Last Insert ID,Connector .net

时间:2011-12-15 09:30:14

标签: c# .net mysql

我正在使用MySql Connector .net,我需要获取上一个查询生成的插入ID。现在,我假设MySqlHelper.ExecuteNonQuery的返回值应该是最后一个插入ID,但它只返回1.

我正在使用的代码是:

int insertID = MySqlHelper.ExecuteNonQuery(Global.ConnectionString, 
"INSERT INTO test SET var = @var", paramArray);

但是insertID总是1.我尝试创建一个MySql连接并手动打开/关闭,这导致了相同的行为

6 个答案:

答案 0 :(得分:82)

只需使用LastInsertedId字段

MySqlCommand dbcmd = _conn.CreateCommand();
dbcmd.CommandText = sqlCommandString;
dbcmd.ExecuteNonQuery();
long imageId = dbcmd.LastInsertedId;

答案 1 :(得分:3)

尝试使用此查询来获取最后插入的ID -

SELECT LAST_INSERT_ID();

然后,运行DbCommand.ExecuteReader方法获取IDataReader -

command.CommandText = "SELECT LAST_INSERT_ID()";
IDataReader reader = command.ExecuteReader();

...并从读者那里获取信息 -

if (reader != null && reader.Read())
  long id = reader.GetInt64(0);

...不要忘记关闭阅读器; - )

答案 2 :(得分:3)

我遇到了同样的问题,经过一些测试后,我发现问题似乎是连接方法;您正在使用连接字符串。

这当然是利用自动连接池重用,但在这种情况下它给我带来了麻烦。

我的最终解决方案是创建一个新连接,执行insert查询,然后执行last_insert_id()。在 相同的 连接。

如果不使用相同的连接,last_insert_id()可能会返回任何内容,我不知道为什么,但猜测它会丢失对事物的跟踪,因为它可能是不同的连接。

示例:

MySqlConnection connection = new MySqlConnection(ConnectionString);
connection.Open();

int res = MySqlHelper.ExecuteNonQuery(
    connection,
    "INSERT INTO games (col1,col2) VALUES (1,2);");

object ores = MySqlHelper.ExecuteScalar(
connection,
"SELECT LAST_INSERT_ID();");

if (ores != null)
{
  // Odd, I got ulong here.
  ulong qkwl = (ulong)ores;
  int Id = (int)qkwl;
}

我希望这有助于某人!

答案 3 :(得分:2)

1是受查询影响的记录数,此处只插入一行,因此1返回

要获取插入行的id,必须在sql server中使用scope_identity(),在MySql中使用LAST_INSERT_ID()

答案 4 :(得分:0)

我知道这是一篇过时的文章,但是我一直面临与Snorvarg相同的问题。使用MySqlHelper,并使用连接字符串而不是Connection对象(以允许MySqlHelper使用连接池), SELECT LAST_INSERT_ID()通常会给我执行的上一个查询的ID,或者其他次它将返回零。然后,我将不得不再次调用 SELECT LAST_INSERT_ID()以获得正确的ID。

我的解决方案是将所有正在执行的查询与调用 SELECT LAST_INSERT_ID()之间的所有内容封装在TransactionScope中。这迫使MySqlHelper坚持一个连接,而不是打开两个单独的连接。

所以:

string sql = "INSERT INTO games (col1,col2) VALUES (1,2);");
string connectionString = "some connection string";

using (TransactionScope scope = new TransactionScope)
{
    int rowsAffected = MySqlHelper.ExecuteNonQuery(connectionString, sql);    
    object id = MySqlHelper.ExecuteScalar(connectionString, "SELECT LAST_INSERT_ID();");
    scope.Complete();
}

答案 5 :(得分:0)

尝试在存储库中的以下工作解决方案。

 string query = $"INSERT INTO `users`(`lastname`, `firstname`, `email`, `createdate`, `isdeleted`) " +
                $"VALUES ('{userEntity.LastName}','{userEntity.FirstName}','{userEntity.Email}','{userEntity.CreateDate}',{userEntity.IsDeleted});" +
                $"SELECT LAST_INSERT_ID();";
           var res= _db.ExecuteScalar(query);

            return (int)(UInt64)res;