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ählt

    Ich 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.


Anmelden zum Antworten