Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取程序中每个“计算机”的每个连接的ID_C#_Mysql_Winforms - Fatal编程技术网

C# 获取程序中每个“计算机”的每个连接的ID

C# 获取程序中每个“计算机”的每个连接的ID,c#,mysql,winforms,C#,Mysql,Winforms,我希望我能解释我自己。我在MySQL服务器上有一个PK integer自动递增的表;在客户端,使用WinForm程序进行插入、更新和查询的两台或更多电脑 如果这样会发生什么 PC01插入一条记录 PC02在PC01之后插入不同的记录 但如果PC01查询其ID时从表中选择MAX ID,它将获得由PC02创建的记录生成的ID,该怎么办 考虑到您是使用非root用户输入数据库的。为每台电脑上的每个连接获取正确ID的最佳选择是什么?我应该添加或考虑什么?< P>使用Max查找多个客户端同时插入时的最新I

我希望我能解释我自己。我在MySQL服务器上有一个PK integer自动递增的表;在客户端,使用WinForm程序进行插入、更新和查询的两台或更多电脑

如果这样会发生什么

PC01插入一条记录

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

但如果PC01查询其ID时从表中选择MAX ID,它将获得由PC02创建的记录生成的ID,该怎么办


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

< P>使用Max查找多个客户端同时插入时的最新ID是一个巨大的错误。使用最后一个插入ID函数

例如,假设将插入到具有自动增量列和名称列的Customers表中

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库,您将无法使用该组件,并且您还需要某种“自定义”函数来获得相同的结果,例如,选择Sql Server的作用域标识。

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

例如,假设将插入到具有自动增量列和名称列的Customers表中

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库,您将没有可用的组件,并且您还需要某种“自定义”函数来获得相同的结果,例如,选择Sql Server的作用域标识。

谢谢。将SELECT LAST_INSERT_ID放在同一个字符串中会强制服务器执行请求它的客户机,对吗?MySql可以执行所谓的批处理更新,这意味着您可以将两个或多个sql语句放在一个字符串中,用分号分隔这些语句。所有语句都将被执行,最后一个语句是单个值的select,将由executesAlarmySqlCommand返回,该命令有一个LastInsertedId属性,该属性将在插入后填充,即使您没有将select last\u INSERT\u ID添加到SQL:这很有趣。虽然我认为它不是实现IDbCommand接口的类的标准,但它可能是有用的,哦,关于自动增量列的任何内容都不是真正的标准化正确的;它是IDbCommand和DbCommand的补充,因此只有在显式使用MySqlCommand对象时才能访问它。我看到您的示例代码使用MySqlCommand,这就是我提到它的原因。谢谢。将SELECT LAST_INSERT_ID放在同一个字符串中会强制服务器执行请求它的客户机,对吗?MySql可以执行所谓的批处理更新,这意味着您可以将两个或多个sql语句放在一个字符串中,用分号分隔这些语句。所有语句都将被执行,最后一个语句是单个值的select,将由executesAlarmySqlCommand返回,该命令有一个LastInsertedId属性,该属性将在插入后填充,即使您没有将select last\u INSERT\u ID添加到SQL:这很有趣。虽然我认为它不是实现IDbCommand接口的类的标准,但它可能是有用的,哦,关于自动增量列的任何内容都不是真正的标准化正确的;它是IDbCommand和DbCommand的补充,因此只有在显式使用MySqlCommand对象时才能访问它。我看到您的示例代码使用MySqlCommand,这就是我提到它的原因。