【问题标题】:Get ID for each connection in the program for each "computer"获取每个“计算机”程序中每个连接的 ID
【发布时间】:2020-06-30 17:37:03
【问题描述】:

我希望我能解释一下自己。我在 MySQL 服务器上有一个带有自动增量 PK 整数的表;在客户端,两台(或多台)装有 WinForm 程序的 PC 进行插入、更新和查询。

如果会发生什么?

  • PC01 插入一条记录。

  • PC02 在 PC01 之后插入不同的记录。

但是如果PC01查询它的ID(SELECT MAX (ID) FROM table)会得到PC02创建的记录生成的ID呢?

考虑到您使用非 root 用户进入数据库。为每台电脑上的每个连接获取正确 ID 的最佳选择是什么?我应该添加或考虑什么?

【问题讨论】:

    标签: c# mysql winforms


    【解决方案1】:

    当多个客户端可以同时插入时,使用 MAX 查找最新 ID 是一个巨大的错误。使用 LAST_INSERT_ID() 函数

    例如,假设您插入到具有 AUTOINCREMENT 列和 Name 列的客户表中

    string SQLText = "INSERT INTO Customers (Name) VALUES (@name);SELECT LAST_INSERT_ID()";
    using(MySqlConnection cn = new MySqlConnection(.....))
    using(MySqlCommand cmd = new MySqlCommand(SQLText,cn))
    {
       cn.Open();
       cmd.Parameters.Add("@name", MySqlDbType.VarChar).Value = "Steve";
       int lastID = (int)cmd.ExecuteScalar();
       ....
    }
    

    这里重要的是 LAST_INSERT_ID 返回调用它的连接的自动生成值。这样,如果你有两个连接,每个连接都有自己的 id 返回

    正如下面Bradley Grainger 所评论的那样,MySql 提供了一个来自MySqlCommand 类的名为LastInsertedId 的“非标准”属性,该属性包含的值与您可以从LAST_INSERT_ID() 函数中获得的值相同。我对这处房产有一种复杂的感觉。从某种角度来看,它非常方便,但是如果您打算更改数据库,那么您需要一个不同的 ado.net 库,并且您将没有可用的商品,并且您需要再次获得某种“自定义”功能相同的结果(例如 SELECT SCOPE_IDENTITY() 用于 Sql Server)。

    【讨论】:

    • 谢谢。将SELECT LAST_INSERT_ID() 放在同一个字符串中会强制服务器执行请求它的客户端,对吧?
    • MySql 可以执行所谓的“批量更新”,这意味着您可以将两个或多个 sql 语句放在一个字符串中,用分号分隔语句。所有语句都将被执行,最后一个是单个值的选择将由 ExecuteScalar 返回
    • MySqlCommand 有一个LastInsertedId 属性,即使您没有将SELECT LAST_INSERT_ID() 添加到SQL 中,该属性也会被填充(在INSERT 之后):dev.mysql.com/doc/dev/connector-net/8.0/html/…
    • 这很有趣。它可能很有用,尽管我认为它不是实现 IDbCommand 接口的类的标准,(哦,关于自动增量列的任何事情都不是真正标准化的)
    • 正确;它是对IDbCommand(和DbCommand)的补充,因此只有在明确使用MySqlCommand 对象时才能访问它。 (我看到你的示例代码使用了MySqlCommand,这就是我提到它的原因。)
    猜你喜欢
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2021-07-31
    相关资源
    最近更新 更多