MySql最后插入ID, Connector .net
本文关键字:Connector net ID 最后 插入 MySql | 更新日期: 2023-09-27 18:17:51
我正在使用MySql Connector .net,我需要获得由最后一个查询生成的插入id。现在,我假设MySqlHelper.ExecuteNonQuery
的返回值应该是最后一个插入id,但它只返回1。
我使用的代码是:
int insertID = MySqlHelper.ExecuteNonQuery(Global.ConnectionString,
"INSERT INTO test SET var = @var", paramArray);
然而insertID
总是1。我尝试创建MySql连接并手动打开/关闭,导致相同的行为
使用LastInsertedId字段
MySqlCommand dbcmd = _conn.CreateCommand();
dbcmd.CommandText = sqlCommandString;
dbcmd.ExecuteNonQuery();
long imageId = dbcmd.LastInsertedId;
1是受查询影响的记录的数目,这里只插入一行,所以1返回
获取插入行的id必须在sqlserver中使用scope_identity()
,在MySql中使用LAST_INSERT_ID()
尝试使用此查询获取最后插入的id -
SELECT LAST_INSERT_ID();
然后,执行DbCommand。获取IDataReader的ExecuteReader方法-
command.CommandText = "SELECT LAST_INSERT_ID()";
IDataReader reader = command.ExecuteReader();
…并从读者那里获取信息-
if (reader != null && reader.Read())
long id = reader.GetInt64(0);
…不要忘记关闭阅读器;-)
我有同样的问题,经过一些测试,我发现问题似乎是连接方法;您正在使用连接字符串。
这当然是为了利用自动连接池重用,但在这种情况下它给我带来了麻烦。
我的最终解决方案是创建一个新连接,执行插入查询,然后执行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;
}
我希望这能帮助到别人!
我知道这是一篇老文章,但我一直面临着与Snorvarg相同的问题。使用MySqlHelper,并使用连接字符串而不是连接对象(允许MySqlHelper使用连接池),SELECT LAST_INSERT_ID()通常会给我之前执行的查询的ID,或者其他时候它会返回零。然后,我必须第二次调用SELECT LAST_INSERT_ID()以获得正确的ID。
我的解决方案是封装正在执行的查询和在TransactionScope中调用SELECT LAST_INSERT_ID()之间的所有内容。这迫使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();
}
在存储库中尝试下面的工作解决方案。
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;