C# MySQL的问题';s最后一次插入ID()
我在上次插入ID()时遇到问题。 每次使用它时,我都需要打开和关闭一个新连接。 这大大降低了我的应用程序速度。 我需要为每个插入的id执行许多insert语句end get 都在同一个连接上! 如何在同一连接上获取最后插入的ID 对于MySQl、ODBC和C#,从一个没有并发问题的特定表开始 这是我的密码:C# MySQL的问题';s最后一次插入ID(),c#,mysql,odbc,C#,Mysql,Odbc,我在上次插入ID()时遇到问题。 每次使用它时,我都需要打开和关闭一个新连接。 这大大降低了我的应用程序速度。 我需要为每个插入的id执行许多insert语句end get 都在同一个连接上! 如何在同一连接上获取最后插入的ID 对于MySQl、ODBC和C#,从一个没有并发问题的特定表开始 这是我的密码: #region Private Variables private static DataAccess _DataAccess = null; private static object _
#region Private Variables
private static DataAccess _DataAccess = null;
private static object _SyncLock = new object();
private OdbcConnection myConnection = null;
#endregion
#region Instance Method
public static DataAccess Instance
{
get
{
lock (_SyncLock)
{
if (_DataAccess == null)
_DataAccess = new DataAccess();
return _DataAccess;
}
}
}
#endregion
#region Constractors
public DataAccess()
{
myConnection = new OdbcConnection(stringConnDB);
myConnection.Open();
}
#endregion
每次使用它时,我都需要打开和关闭一个新连接
不,你不需要新的连接。您应该在insert语句之后在同一连接上使用它
从:
生成的ID在服务器中按每个连接进行维护。这意味着[LAST\u INSERT\u ID
]返回给给定客户端的值是为影响该客户端的AUTO\u INCREMENT
列的最新语句生成的第一个AUTO\u INCREMENT
值。此值不受其他客户端的影响,即使它们生成自己的AUTO_INCREMENT
值。此行为确保每个客户端都可以检索自己的ID,而不必关心其他客户端的活动,也不需要锁或事务
每次使用它时,我都需要打开和关闭一个新连接
不,你不需要新的连接。您应该在insert语句之后在同一连接上使用它
从:
生成的ID在服务器中按每个连接进行维护。这意味着[LAST\u INSERT\u ID
]返回给给定客户端的值是为影响该客户端的AUTO\u INCREMENT
列的最新语句生成的第一个AUTO\u INCREMENT
值。此值不受其他客户端的影响,即使它们生成自己的AUTO_INCREMENT
值。此行为确保每个客户端都可以检索自己的ID,而不必关心其他客户端的活动,也不需要锁或事务
为什么你认为你需要打开一个新的连接?实际上,您不应该打开新连接,您应该在同一个连接上使用
last\u insert\u id()
,以确保得到正确的结果
如果您尝试了一个新的连接,并且它似乎可以工作,那么这仅仅是因为连接是共用的,并且您第二次碰巧得到了相同的连接。当您开始对多个用户使用此连接时,它将失败。为什么您认为需要打开新连接?实际上,您不应该打开新连接,您应该在同一个连接上使用
last\u insert\u id()
,以确保得到正确的结果
如果您尝试了一个新的连接,并且它似乎可以工作,那么这仅仅是因为连接是共用的,并且您第二次碰巧得到了相同的连接。当您开始对多个用户使用此连接时,它将失败。但我不明白他们会说:“生成的ID在每个连接的基础上保留在服务器中”-不是每个客户端都需要一个新连接,以便每个客户端都能在不受其他客户端干扰的情况下获得其最后一个插入ID吗?@user374290:No,它的意思正好相反。您必须为插入使用与获取id时相同的连接,以确保其正确性。如果打开一个新连接,则id将为空,或者如果连接是池连接,则为以前执行的任意插入的id。这个随机插入可能就是您刚才所做的,但也可能是其他插入。很明显,我对插入使用了相同的连接,并选择了紧随其后的最后一个插入ID()。这完全不是我要说的!每次我做这两件事的时候,我都必须打开一个新的连接,这是非常糟糕的-我会在这里显示我使用的代码我编辑了我的问题,这样你就可以看到我的代码并理解我的问题problam@user374290:没有理由认为运行特定查询会阻止您重用连接。如果您没有正确关闭命令或数据读取器,使它们在您尝试将其用于下一个命令时仍在使用连接,则可能会产生这种效果。您的代码也有同步命令,但这不是必需的。每个线程都应该有自己的连接,所以变量不应该是静态的。如果您试图同时使用来自两个线程的同一连接,您将得到错误。但我不理解为什么会这样说:“生成的ID在服务器中以每个连接为基础进行维护”-难道不是每个客户端都需要一个新的连接,以便每个客户端都能在不受其他客户端干扰的情况下获得其最后一个插入id吗?@user374290:不,它的意思正好相反。您必须为插入使用与获取id时相同的连接,以确保其正确性。如果打开一个新连接,则id将为空,或者如果连接是池连接,则为以前执行的任意插入的id。这个随机插入可能就是您刚才所做的,但也可能是其他插入。很明显,我对插入使用了相同的连接,并选择了紧随其后的最后一个插入ID()。这完全不是我要说的!每次我做这两件事的时候,我都必须打开一个新的连接,这是非常糟糕的-我会在这里显示我使用的代码我编辑了我的问题,这样你就可以看到我的代码并理解我的问题problam@user374290:没有理由认为运行特定查询会阻止您重用连接。如果您没有正确关闭命令或数据读取器,使它们在您尝试将其用于下一个命令时仍在使用连接,则可能会产生这种效果。您的代码也有同步命令,但这不是必需的。每个线程都应该有自己的连接,所以变量不应该是b