无法检索 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 获取自动递增的密钥?

具有基于用户的安全性的 Microsoft Access 2010 (mdb) 自动化

使用 Microsoft.Jet.OLEDB.4.0 从 C# 将行插入 Access db,自动编号列设置为零