2011-04-06 16 views
8

Estoy intentando insertar una fila y volver a la identidad de la nueva fila con algo como esto:Inserción de una fila y la recuperación de la identidad de la nueva fila en SQL Server CE

INSERT INTO blah....; 
SELECT @@IDENTITY as NewID; 

Estoy intentando ejecutar tanto declaraciones con una sola invocación de un objeto DbCommand en C# ... no parece funcionar o tengo algo mal.

He leído que Compact Edition no admite la ejecución de varias instrucciones en un lote ... pero también encontré esto:

Si desea ejecutar varias consultas al mismo tiempo, se debe incluir un nuevo carácter de línea para cada enunciado y un punto y coma al final de cada enunciado.

Fuente: http://technet.microsoft.com/en-us/library/bb896140(SQL.110).aspx

Así Funciona o no ... y si es así lo que me estoy perdiendo?

(me doy cuenta de que puedo ejecutar dos comandos y eso funciona bien, pero me pregunto si me falta algo).

+1

¿Qué quiere decir con "does not seem work" [sic]? ¿Lo que pasa? ¿Recibes algún mensaje de error? – Guffa

Respuesta

8

Parece un error de doc, es al revés. Solo puede ejecutar una sola instrucción por llamada ExecuteNonQuery.

+1

Sorprendido si un error de doc se puede repetir al menos 3 veces para SQLCE [3.5 SP1] (http://technet.microsoft.com/en-us/library/bb896140 (SQL.100) .aspx), [3.5 SP2] (http://technet.microsoft.com/en-us/library/bb896140(SQL.105).aspx) y [4.0] (http://technet.microsoft.com/en-us/library/bb896140 (SQL.110) .aspx)? Estoy realmente confundido. –

3

debe definir un parámetro de salida para obtener valor de identidad

sqlCommand Command = Conn.CreateCommand(); 
Command.CommandText = "insert into MyTable(Value1,Value2) values(MyValue,MyValue)" 
Command.ExecuteNonQuery(); 
Command.CommandText = "select @ID = @@IDENTITY" 
SqlParameter ID = new SqlParameter("@ID", SqlDbType.Int); 
ID.Direction = ParameterDirection.Output; 
Command.Parameters.Add(ID); 
Command.ExecuteNonQuery(); 
int NewID = (int)ID.Value; 
+0

¿Estás seguro de eso? Estoy usando DbCommand.ExecuteScalar() y devuelve la nueva identidad de los registros bien. Solo necesita ser un comando separado, no uno por lotes. –

+2

SQL Server Compact Edtion solo admite una sola instrucción por comando. [link] (http://social.msdn.microsoft.com/Forums/en-US/sqlce/thread/1d1d3267-dc29-470b-bb20-00487a39bc87/) – mariocase84

+1

Además, parece que DEBE "SELECCIONAR @@ IDENTIDAD" "contra la misma conexión abierta que ha ejecutado" INSERTAR ". – Agent007

0

Después de una gran cantidad de errores con sql-server-ce como no podía ser de Dirección de salida Tengo que esto funcione.

public static long GetIdentity(this IDbConnection connection) 
{ 
    var cmd = connection.CreateCommand(); 
    cmd.CommandText = "SELECT @@IDENTITY"; 
    cmd.CommandType = CommandType.Text; 
    var id = cmd.ExecuteScalar(); 
    return (long)(decimal)id; 
} 
Cuestiones relacionadas