Inserisci righe in Access db da C # usando Microsoft.Jet.OLEDB.4.0, la colonna autonumber è impostata su zero

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

  •  03-07-2019
  •  | 
  •  

Domanda

Sto usando C # e il provider Microsoft.Jet.OLEDB.4.0 per inserire righe in un mdb di Access.

Sì, so che Access fa schifo. È un'app legacy enorme e tutto il resto funziona bene.

La tabella ha una colonna autonumber. Inserisco le righe, ma la colonna autonumber è impostata su zero.

Ho cercato su Google la domanda e ho letto tutti gli articoli che ho trovato su questo argomento. Uno ha suggerito di inserire -1 per la colonna autonumber, ma questo non ha funzionato. Nessuno degli altri suggerimenti che ho trovato ha funzionato.

Sto usando OleDbParameter, non concatenando una grande stringa di testo SQL.

Ho provato a inserire con e senza una transazione. Nessuna differenza.

Come posso far funzionare questo inserto (ovvero impostare correttamente il contenuto della colonna autonumber)?

Grazie mille in anticipo,

Adam Leffert

È stato utile?

Soluzione

In Access è possibile INSERIRE un valore esplicito in una colonna IDENTITY (a.k.a. Automnumber). Se tu (o il tuo middleware) stai scrivendo il valore zero nella colonna IDENTITY e non ci sono vincoli univoci sulla colonna IDENTITY, ciò potrebbe spiegarlo.

Giusto per essere chiari, dovresti usare la sintassi

INSERT INTO (<column list>) ... 

e l'elenco delle colonne dovrebbe omettere la colonna IDENTITY. Jet SQL ti permetterà di omettere l'intero elenco di colonne ma poi implicitamente includi la colonna IDENTITY. Pertanto, è necessario utilizzare la sintassi INSERT INTO () per omettere esplicitamente la colonna IDENTITY.

In Access / Jet, è possibile scrivere valori espliciti nella colonna IDENTITY, nel qual caso il valore ovviamente non verrà generato automaticamente. Pertanto, assicurati che tu e il tuo middleware (ADO.NET ecc.) Non scriviate esplicitamente un valore zero nella colonna IDENTITY.

A proposito, solo per la colonna IDENTITÀ nella tabella seguente verrà generato automaticamente il valore zero ogni secondo INSERT:

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

Altri suggerimenti

Quando si esegue l'inserimento, è necessario accertarsi di NON specificare un valore per la colonna AutoNumber. Proprio come in SQL Server non si inserisce un valore per una colonna identità.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top