Insertar filas en la base de datos de Access desde C # usando Microsoft.Jet.OLEDB.4.0, la columna Autonumber se establece en cero

StackOverflow https://stackoverflow.com/questions/153023

  •  03-07-2019
  •  | 
  •  

Pregunta

Estoy usando el proveedor C # y Microsoft.Jet.OLEDB.4.0 para insertar filas en un mdb de Access.

Sí, sé que el acceso apesta. Es una gran aplicación heredada, y todo lo demás funciona bien.

La tabla tiene una columna autonumber. Inserto las filas, pero la columna Autonumber se establece en cero.

Busqué en Google la pregunta y leí todos los artículos que pude encontrar sobre este tema. Uno sugirió insertar -1 para la columna autonumber, pero esto no funcionó. Ninguna de las otras sugerencias que pude encontrar funcionó.

Estoy usando OleDbParameter's, no concatenando una gran cadena de texto SQL.

He intentado la inserción con y sin una transacción. No hay diferencia.

¿Cómo consigo que este inserto funcione (es decir, establezca correctamente el contenido de la columna Autonumber)?

Muchas gracias de antemano,

Adam Leffert

¿Fue útil?

Solución

En Access es posible INSERTAR un valor explícito en una columna IDENTITY (a.k.a. Automnumber). Si usted (o su middleware) está escribiendo el valor cero en la columna IDENTIDAD y no hay una restricción única en la columna IDENTIDAD, eso podría explicarlo.

Para que quede claro, debes utilizar la sintaxis

INSERT INTO (<column list>) ... 

y la lista de columnas debe omitir la columna IDENTIDAD. Jet SQL le permitirá omitir toda la lista de columnas, pero luego, implícitamente, incluya la columna IDENTIDAD. Por lo tanto, debe utilizar la sintaxis INSERT INTO () para omitir explícitamente la columna IDENTIDAD.

En Access / Jet, puede escribir valores explícitos en la columna IDENTIDAD, en cuyo caso el valor obviamente no se generará automáticamente. Por lo tanto, asegúrese de que tanto usted como su middleware (ADO.NET, etc.) no escriban explícitamente un valor cero en la columna IDENTIDAD.

Por cierto, solo para la columna IDENTIDAD en la tabla siguiente se generará automáticamente el valor cero cada segundo INSERTAR:

CREATE Table Test1 
(
   ID INTEGER IDENTITY(0, -2147483648) NOT NULL, 
   data_col INTEGER
);

Otros consejos

Al realizar la inserción, debe asegurarse de que NO está especificando un valor para la columna Autonumérico. Al igual que en SQL Server, no inserta un valor para una columna de identidad.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top