无法检索 Microsoft Access 自动编号值
Posted
技术标签:
【中文标题】无法检索 Microsoft Access 自动编号值【英文标题】:Unable to Retrieve Microsoft Access Autonumber Values 【发布时间】:2013-03-25 18:23:59 【问题描述】:访问 2003
VS 2010 C#
正如主题标题所说,我对此有疑问。它正在创建一个新字段来打印日期和时间,它应该在当前 ID 中标记日期和时间。我也尝试过 UPDATE 命令参数但没有成功。
我有一个不同的方法 (btnloggedIn) 可以保存用户名、登录日期和登录时间。这可以正常工作。我创建了另一种我遇到问题的方法 (btnLoggedOut)。目的是保存用户退出时的退出日期和退出时间,在登录时创建自动 ID 的 Access 中的来列中。
表名 - 登录表
>
FieldName Data Type
UserName Text
Password Text
表名 - LoginLogTable
FieldName Data Type
ID AutoNumber
UserName Text
LoggedInDate Date/Time
LoggedInTime Date/Time
LoggedOutDate Date/Time
LoggedOutTime Date/Time
ID 是 PK。它的一对多关系。登录的用户可以有很多关于日期和时间的详细信息
如果有人可以在这里帮助我,我将不胜感激。
private void btnLogOut_Click(object sender, EventArgs e)
OleDbCommand cmd = new OleDbCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = " UPDATE [LoginLogTable] SET [LoggedOutDate] = ?, [LoggedOutTime] = ?
WHERE ID = ?";
cmd.Parameters.AddWithValue("@LoggedOutDate", DateTime.Now.ToShortDateString());
cmd.Parameters.AddWithValue("@LoggedOutTime", DateTime.Now.ToString("HH:mm"));
cmd.Connection = myCon;
myCon.Open();
cmd.ExecuteNonQuery();
Close();
这是 btnLogin 方法的部分代码...
OleDbCommand cmd = new OleDbCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "INSERT INTO LoginLogTable (UserName, LoggedInDate, LoggedInTime) VALUES (@UserName, @LoggedInDate, @LoggedInTime)";
cmd.Parameters.AddWithValue("@UserName", txtUserName.Text);
cmd.Parameters.AddWithValue("@LoggedInDate", DateTime.Now.ToShortDateString());
cmd.Parameters.AddWithValue("@LoggedInTime", DateTime.Now.ToString("HH:mm"));
cmd.Connection = myCon;
myCon.Open();
cmd.ExecuteNonQuery();
myCon.Close();
【问题讨论】:
澄清一下:这是一个 ASP.NET (web) 应用程序吗? @GordThompson - 没有它的 Windows 窗体应用程序,为什么? 您必须先构造并执行您的INSERT,然后运行SELECT @@IDENTITY
查询以检索INSERT 刚刚创建的ID 值。它们是单独的操作。就目前而言,您的代码(显然)试图将这两个操作结合起来,但这是行不通的。另外,请记住 SELECT @@IDENTITY
将返回单个(标量)值,而不是行集,因此这可能会影响您调用它时调用的方法。
【参考方案1】:
如果您在用户单击“注销”按钮时执行SELECT @@IDENTITY
查询,您可能不会得到您希望的值。 SELECT @@IDENTITY
旨在在创建记录的INSERT
之后立即调用(在这种情况下,当用户登录时in)。然后,您可以将该值隐藏在您的应用程序中,并在用户注销时使用它来选择相同的记录。
如果您的应用程序插入任何其他记录(在其他表中)会导致创建新的身份(也称为“自动编号”)值,那么SELECT @@IDENTITY
将返回最新的 那些 值.因此,只需在用户登录时获取 @@IDENTITY
值,并在用户再次注销时保存它。
【讨论】:
我想我读它好像很简单,眨眼。你能否确认你的最后一句话,关于抓住@@IDENTITY,我想我知道你的意思是在 btnLogOut 方法中,但无论如何我都会谷歌。我需要时间来解决这个问题。所以提前谢谢。 我的意思是,您的SELECT @@IDENTITY
调用需要在您的“LoggedIn”代码中进行,紧跟在为该登录创建记录的INSERT
之后。您可以将SELECT @@IDENTITY
返回的值保存在您自己的应用程序中的变量中,然后在您的“LogOut”代码中的UPDATE
语句的WHERE
子句中使用它。
我正在搜索如何将@@IDENTITY 的返回值保存在变量中。
感谢上帝。因为我收到一条错误消息,我想我可以关闭这个线程并打开一个新线程。希望。【参考方案2】:
通常,这样做的方式是:
-
创建新的登录记录。
通过运行一个新的选择来获取其自动生成的记录 ID,该选择要求该特定用户的最新登录条目。您可以降序排序以保证它是记录集中的第一条记录。
使用该记录 ID 来指定要使用
WHERE ID = ?
更新的登录记录,并使用记录 ID 填写 ID 值。
当您不知道自动生成的主记录 ID 是什么时,这是一种非常典型的数据库记录创建模式。您创建新记录,在记录 ID 中读回它以获取其自动生成的主键 ID 值,然后从那时起使用记录 ID 来引用它。
【讨论】:
re: 第 2 步 - 一般而言,SELECT MAX(ID)...
类型的方法在单用户数据库中运行良好,但在多用户应用程序中不可靠。当然,在这种特殊情况下,我们有 UserName 来缓解这种情况,但如果允许多个并发登录(例如,多个登录为“访客”),它仍然可能失败。 SELECT @@IDENTITY
,如果使用得当,会更可靠。
我是从模式使用中回答的。您不执行SELECT MAX(ID)
,您执行SELECT ID WHERE ...
并提供刚刚用于创建条目的字段的详细信息,按降序排列,因此如果有重复,您将获得最新的条目。在您拥有IDENTIY
函数的特定情况下,除非有特殊原因不使用,否则您应该使用它。以上是关于无法检索 Microsoft Access 自动编号值的主要内容,如果未能解决你的问题,请参考以下文章
Microsoft Access 2013 - 无法通过子表单添加新记录
导入 Microsoft Access 数据库时保留自动编号列的值
根据 Microsoft Access 中的日期自动发送电子邮件
如何使用 JDBC 和 Microsoft Access 获取自动递增的密钥?