2011-08-29 31 views
8

tengo una base de datos en acceso con el campo de aumento automático (ID).cómo obtener el último número de registro después de insertar el registro en la base de datos en el acceso

i insertar disco como éste (en C#)

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

cómo obtener el último número de inserción?

que no quiero correr nueva consulta Sé que en SQL hay algo así como SELECT @@IDENTITY

pero no sé cómo usarlo

gracias de antemano

Respuesta

11

más: Getting the identity of the most recently added record

El proveedor Jet 4.0 soporta @@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(); 
    } 
} 
+0

gracias por la ayuda, obtuve el error en Category.Text – Gali

+4

debe agregar el enlace al artículo original, porque todo está copiado/pegado de ella. – Reniuz

+0

@Reniuz - gracias por la información que acaba de olvidarse de incluirlo –

0

me gusta más, indican el tipo de comando es muy similar a la buena solución proporcionada por 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(); 
        } 
3

supongo que incluso se podría escribir un método de extensión de OleDbConnection ...

public static int GetLatestAutonumber(
    this OleDbConnection connection) 
{ 
    using (OleDbCommand command = new OleDbCommand("SELECT @@IDENTITY;", connection)) 
    { 
     return (int)command.ExecuteScalar(); 
    } 
} 
+0

Solución de Niced funcionó para mí cuando otros no lo hicieron. Sin embargo, he escapado del método de extensión en mi uso, como se ve en mi publicación modificada. –

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 
+0

** De la cola de revisión **: Puedo solicitarle que agregue un poco más de contexto en torno a su respuesta. Las respuestas de solo código son difíciles de entender. Ayudará al solicitante y a los lectores futuros tanto si puede agregar más información en su publicación. – RBT

0

Usando el método de @ Lee.J.Baxter (¡Lo cual fue genial ya que las otras identificaciones no funcionan para mí!) Escapé del método de extensión y lo agregué en línea dentro del formulario en sí:

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(); 
} 

NOTA: En la mayoría de los casos se debe utilizar parámetros en lugar del método string.Format() que se utiliza aquí. Lo hice esta vez, ya que era más rápido y mis valores de inserción no provienen de la entrada de un usuario, por lo que debería ser seguro.

Cuestiones relacionadas