在Access中插入记录后如何获取最后一条记录编号

11

我在Access中有一个带有自动增长字段(ID)的数据库。

我用以下方式插入记录(使用C#):

SQL = "insert into TermNumTbl (DeviceID,IP) values ('" + DeviceID + "','" + DeviceIP + "') ";
OleDbCommand Cmd = new OleDbCommand(SQL, Conn);
Cmd.ExecuteNonQuery();
Cmd.Dispose();
Conn.Close();

如何获取最后一个插入的数?

我不想运行新查询,我知道在SQL中有像SELECT @@IDENTITY这样的东西。

但我不知道如何使用它。

提前感谢。

6个回答

15

更多信息请参见:获取最近添加的记录的标识符

Jet 4.0提供程序支持@@Identity

string query = "Insert Into Categories (CategoryName) Values (?)";
string query2 = "Select @@Identity";
int ID;
string connect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|Northwind.mdb";
using (OleDbConnection conn = new OleDbConnection(connect))
{
  using (OleDbCommand cmd = new OleDbCommand(query, conn))

  {
    cmd.Parameters.AddWithValue("", Category.Text);
    conn.Open();
    cmd.ExecuteNonQuery();
    cmd.CommandText = query2;
    ID = (int)cmd.ExecuteScalar();
  }
}

4
请添加原文链接,因为所有内容都是从原文复制粘贴而来的。 - Renatas M.

5
我猜你甚至可以为 OleDbConnection 编写一个扩展方法...
public static int GetLatestAutonumber(
    this OleDbConnection connection)
{
    using (OleDbCommand command = new OleDbCommand("SELECT @@IDENTITY;", connection))
    {
        return (int)command.ExecuteScalar();
    }
}

不错的解决方案!在其他方法无法解决问题时,这个对我很有用。尽管在我的修改后的帖子中可以看到,我避免使用了扩展方法。 - Anthony Griggs

0

使用 @Lee.J.Baxter 的方法(其他方法对我没有用)我转义了扩展方法,并将其直接添加到表单中:

OleDbConnection con = new OleDbConnection(string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='{0}'", DBPath));
OleDbCommand cmd = con.CreateCommand();
con.Open();
cmd.CommandText = string.Format("INSERT INTO Tasks (TaskName, Task, CreatedBy, CreatedByEmail, CreatedDate, EmailTo, EmailCC) VALUES('{0}','{1}','{2}','{3}','{4}','{5}','{6}')", subject, ConvertHtmlToRtf(htmlBody), fromName, fromEmail, sentOn, emailTo, emailCC);
cmd.Connection = con;
cmd.ExecuteScalar();
using (OleDbCommand command = new OleDbCommand("SELECT @@IDENTITY;", con))
{
    ReturnIDCast =(int)command.ExecuteScalar();
}

注意:在大多数情况下,您应该使用参数而不是我在这里使用的string.Format()方法。我只是因为这样做更快,并且我的插入值并不来自用户输入,所以应该是安全的。


0

我更喜欢指明命令的类型,这与Pranay Rana提供的好解决方案非常相似。

using (OleDbCommand cmd = new OleDbCommand())
                    {
                        cmd.CommandType = CommandType.Text;
                        cmd.CommandText = sql_Insert;
                        cmd.ExecuteNonQuery();

                        cmd.CommandText = sql_obtainID;
                        resultado = (int)comando.ExecuteScalar();
                    }

0
 query = "Insert Into jobs (jobname,daterecieved,custid) Values ('" & ProjectNAme & "','" & FormatDateTime(Now, DateFormat.ShortDate) & "'," & Me.CustomerID.EditValue & ");"'Select Scope_Identity()"
        ' Using cn As New SqlConnection(connect)

          Using cmd As New OleDb.OleDbCommand(query, cnPTA)
                cmd.Parameters.AddWithValue("@CategoryName", OleDb.OleDbType.Integer)
                If cnPTA.State = ConnectionState.Closed Then cnPTA.Open()
                ID = cmd.ExecuteNonQuery
          End Using

从审核队列中:我可以请求您在您的答案周围添加更多的上下文吗?仅有代码的答案很难理解。如果您能在帖子中添加更多信息,这将有助于提问者和未来的读者。 - RBT

-2

简单易懂,

在 Excel 中,我们如何复制上面单元格中的文本?

是的,只需使用 ctrl+" 组合键,而且在 MS ACCESS 中也可以使用。

您可以使用上述组合键来复制上面记录字段的文本,只需确保在移动到下一个字段之前应用了重复验证或编辑字段数据。

如果您需要更多验证或任何特殊操作,请继续搜索 Stack Overflow。


OP很可能正在寻找编程解决方案。这里已经提供了一个有用的答案:https://dev59.com/wGw05IYBdhLWcg3weBhF#7230309。 - HardcoreGamer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接