sqlite fehler 19 "constraint failed"
-
Hallo,
ich komm nicht mehr weiter keine ahnung was er von mir will könnte ihr mir sagen "constraint failed" failed bedeutet ?MfG SK-2
So sieht meinen Funktion aus
int BSUWatcherDatabase::BSUSaveClients(USBClient *pSaveClients) { // Paramter Prüfen if(!pSaveClients)return(BSUWDErrorSet(BSUWD_PARM)); int ret = 0; AnsiString zSQL = "SELECT * FROM USBClients;"; sqlite3_stmt *stmt; USBClient *old; USBClient *Anker = new (struct USBClient); *Anker = *pSaveClients; while (Anker) { //New if(Anker->Status == 1)zSQL = String("INSERT INTO USBClients VALUES (NULL, '"+String(Anker->ClientName)+"', '"+String(Anker->IP)+"','"+String(Anker->Identifier)+"');"); //Update if(Anker->Status == 2)zSQL = String("UPDATE USBClients SET ClientName='"+String(Anker->ClientName)+"', IP='"+String(Anker->IP)+"' , Identifier='"+String(Anker->Identifier)+"' WHERE ID ="+String(Anker->ID)+";"); //Delete if(Anker->Status == 3)zSQL = String("DELETE FROM USBClients WHERE ID="+String(Anker->ID)+";"); //ret = sqlite3_exec(db, "BEGIN TRANSACTION;", 0, 0, 0); //if(ret)return(BSUWDErrorSet(ret)); ret = sqlite3_prepare_v2(db,zSQL.c_str(),strlen(zSQL.c_str()),&stmt, 0); if(ret)return(BSUWDErrorSet(ret)); ret = sqlite3_step(stmt); if(ret != 101)return(BSUWDErrorSet(ret)); ret = sqlite3_reset(stmt); if(ret)return(BSUWDErrorSet(ret)); ret = sqlite3_finalize(stmt); if(ret)return(BSUWDErrorSet(ret)); //ret = sqlite3_exec(db, "COMMIT TRANSACTION;", 0, 0, 0); //if(ret)return(BSUWDErrorSet(ret)); old = Anker; Anker = Anker->Next; delete old; } return(0); };
und so die Tabelle
CREATE TABLE USBClients ( ID integer PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE, ClientName nvarchar(50) NOT NULL, IP nvarchar(15) NOT NULL, Identifier nvarchar(50) NOT NULL UNIQUE );
-
USBClients VALUES (NULL
NOT NULL UNIQUE,
Du willst Null obwohl NOT NULL definiert ist.
-
Danke für deinen Hilfe "Unix-Tom" ,
mit dem NULL parameter das hatte ich mir aus dem Sqlite FAQ gezogen. http://sqlite.org/faq.html#q1
In dem Feld ID muss ich ja eigentlich keinen Wert übergeben werden weil es ja automatisch Hochzählte.
Oder muss ich da irgend ein spass wert übertragen damit er das Feld ID hochzähltIch versuchs mal anders
if(Anker->Status == 1)zSQL = String("INSERT INTO USBClients (ClientName,IP,Identifier) VALUES ('"+String(Anker->ClientName)+"', '"+String(Anker->IP)+"','"+String(Anker->Identifier)+"');");
funzt leider auch nett
Mfg SK-2
-
Also ein Autowert ist ein Autowert wenn nichts anderen angegeben ist.
Hängt sehr vom RDBMS ab.
Bei MySQL kann man einen angeben und er nimmt in auch.
Bei MSSQL muss man vorher sagen das einer angegeben werden darf.
SQLLITE leider keien Ahnung da nie verwendet.Kann es sein das du eine Wert in Identifier bereits drin hast.
Sollte dann zwar etwas von Duplicate entry oder so sagen aber kommt auch aufs RDBMS an.