2012-10-08 4 views
1

Je suis nouveau SQLite et je suis en train d'exécuter le code suivant:SQLite: Insérer dans la colonne d'identité

using (var cn = new SQLiteConnection("Data Source=:memory:;Version=3;")) { 
    cn.Open(); 

    var cmd = cn.CreateCommand(); 
    cmd.CommandText = "CREATE TABLE [ContentItems] ([Id] [int] IDENTITY(1,1) NOT NULL, [Title] [nvarchar](100) NOT NULL, CONSTRAINT [PK_ContentItems] PRIMARY KEY ([Id]))"; 
    cmd.ExecuteNonQuery(); 

    var cmd2 = cn.CreateCommand(); 
    cmd2.CommandText = "INSERT INTO [ContentItems] (Title) VALUES ('Test 1')"; 
    cmd2.ExecuteNonQuery(); 
} 

Mais cela donne l'erreur:

Abort due to constraint violation ContentItems.Id may not be NULL

J'ai eu un coup d'oeil à travers la documentation mais basé sur mon passé expérience SQL je ne peux pas voir pourquoi cela ne fonctionne pas. J'apprécierais l'aide. Merci

+2

Vous avez oublié le bit d'incrémentation automatique – EaterOfCode

+1

Une colonne d'ID auto-incrémentée explicite n'est généralement pas nécessaire dans SQLite: http://www.sqlite.org/autoinc.html – reinierpost

Répondre

5

SQLite crée ce que vous envisagez comme une colonne IDENTITY en utilisant le mot-clé AUTOINCREMENT. Dans votre exemple, la colonne ID n'est pas créée avec AUTOINCREMENT et, comme elle est déclarée NOT NULL, vous devez fournir une valeur.

L'instruction CREATE vous êtes AFTER est:

CREATE TABLE [ContentItems] (
    [Id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
    [Title] TEXT NOT NULL, 
    CONSTRAINT [PK_ContentItems] PRIMARY KEY ([Id]) 
) 

Notez que SQLite utilise le type de données de texte (bien qu'il carte tout ce qui contient « CHAR » à ce type de données) et n'a pas besoin ou maximum respecter longueurs de champ.

+1

Merci d'expliquer pourquoi je n'ai trouvé aucune documentation sur IDENTITÉ. – nfplee