как получить номер последней записи после вставки записи в базу данных в доступе - PullRequest
10 голосов
/ 29 августа 2011

У меня есть доступ к базе данных с полем автоматического увеличения (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

но я не знаю, как его использовать

заранее спасибо

Ответы [ 5 ]

14 голосов
/ 29 августа 2011

Подробнее об этом: Получение идентификатора последней добавленной записи

Поставщик 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();
  }
}
5 голосов
/ 27 января 2016

Полагаю, вы могли бы даже написать метод расширения для OleDbConnection ...

public static int GetLatestAutonumber(
    this OleDbConnection connection)
{
    using (OleDbCommand command = new OleDbCommand("SELECT @@IDENTITY;", connection))
    {
        return (int)command.ExecuteScalar();
    }
}
0 голосов
/ 16 августа 2017

Используя метод @ 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();
}

ПРИМЕЧАНИЕ: В большинстве случаев вы должны использовать Parameters вместо метода string.Format (), который я использовал здесь. Я просто сделал это на этот раз, так как это было быстрее, и мои значения вставки не поступают от ввода пользователя, поэтому это должно быть безопасно.

0 голосов
/ 11 мая 2017
 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
0 голосов
/ 20 марта 2015

мне больше нравится указывать тип команды очень похоже на хорошее решение, предоставленное 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();
                    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...