【问题标题】:Parametrized query with MySQL executed atomically with SELECT using ADO.NET使用 ADO.NET 使用 SELECT 以原子方式执行 MySQL 的参数化查询
【发布时间】:2018-08-27 03:46:14
【问题描述】:

我正在使用 ADO.NET 和参数化查询(未命名的参数和 ExecuteNonQuery 方法)写入 SQL Server 和 MySQL dBase(应用程序必须与两者无关)。两者都有,所有表的主键都是自动递增的。

使用 SQL Server,我可以将“CommandText”设置为以下内容,在这种情况下,参数化查询和 SELECT 以原子方式执行:

INSERT INTO myTable (param1, param2, param3) VALUES (?, ?, ?);SELECT MAX(ID) FROM myTable;

这可确保返回的 ID(主键)是与参数化查询对应的 ID。

不幸的是,对于 MySQL,“;SELECT...”会产生语法错误。如何使用 ADO.NET 和 MySQL 通过 SELECT 查询原子地执行参数化查询?

提前感谢您的帮助!

【问题讨论】:

  • 你想使用last_insert_id()和一个允许你同时运行两个查询的接口函数。
  • 请注意,如果多个用户同时运行语句,SELECTMAX(ID) 方法可能不会返回刚刚插入的值,除非您在具有可序列化隔离级别的事务中执行查询。 MySQL 和 SQL Server 都有返回分配值的专有方法(SCOPE_IDENTITY()last_insert_id()),但这需要不同的查询,您可以按照 @GordonLinoff 的建议进行抽象。
  • 非常感谢大家的帮助!根据大家的建议,我不再使用 Select Max(ID)。而是使用 SQL Server 在 INSERT 语句中添加 OUTPUT 子句(此处建议:stackoverflow.com/questions/10999396/…)。对于 MySQL,我按照建议使用 select last_insert_id()。一切顺利!

标签: mysql ado.net executenonquery


【解决方案1】:

非常感谢大家的帮助!根据大家的建议,我不再使用 Select Max(ID)。

与 SQL Server 不同,我在 INSERT 语句中添加了一个 OUTPUT 子句,如下所示: How do I use an INSERT statement's OUTPUT clause to get the identity value?

对于 MySQL,我按照建议使用 select last_insert_id()。有效!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    相关资源
    最近更新 更多