violation of PRIMARY or UNIQUE KEY constraint ...



  • Hi,
    Mein Programm, schreibt aus einem DataTable in eine Firebird Datenbank, in der ich einen Primary Key auf Unique gesetzt habe um so doppelte einträge abzufangen.
    Doch wenn ich einen bereits vorhanden eintrag in der Datenbank erneut reinschreiben möchte bekomme ich diesen Fehler:
    violation of PRIMARY or UNIQUE KEY constraint "PK_FILES" on table "FILES"

    Ich würde mich freuen, wenn mir jemand helfen würde diesen fehler zu beseitigen!

    mfg Zuluhutu



  • Wie schreibst du denn den Eintrag?

    ➡ Datenbank-Forum?



  • wieso "Datenbank-Forum"?
    ich brauche ja hilfe, was den C# code dazu betrifft!



  • Dann musst du deinen Code schon zeigen. 😉



  • Zuluhutu schrieb:

    Hi,
    Mein Programm, schreibt aus einem DataTable in eine Firebird Datenbank, in der ich einen Primary Key auf Unique gesetzt habe um so doppelte einträge abzufangen.

    Ein Primary Key ist per Definition eindeutig

    Doch wenn ich einen bereits vorhanden eintrag in der Datenbank erneut reinschreiben möchte bekomme ich diesen Fehler:
    violation of PRIMARY or UNIQUE KEY constraint "PK_FILES" on table "FILES"

    Na dann funktioniert das Ding doch super. Versuchs vielleicht mal mit Edit/Update anstatt den selben Datensatz nochmal reinzuschreiben 😉



  • Hi,

    Hier die klasse, für den connect, schreiben und laden in die DB:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    using System.Windows.Forms;
    using FirebirdSql.Data.FirebirdClient;
    
    namespace WindowsFormsApplication1
    {
        class Connect
        {
            FbConnection dbcon;
            FbDataAdapter dbAdapter;
            DataTable data;
    
            public Connect()
            {
    
            }
    
            public void Con(string path)
            {
    
                string connectionString =
                            "Database=" + path + ";" +
                            "User=SYSDBA;" +
                            "Password=masterkey;" +
                            "Dialect=3;" +
                            "Server=localhost";
                dbcon = new FbConnection(connectionString);
                string sqlstr = "SELECT * FROM \"FILES\"";
                dbAdapter = new FbDataAdapter(sqlstr, dbcon);
                data = new DataTable();
                FbParameter param;
                dbAdapter.InsertCommand = new FbCommand("Insert into FILES (FILENAME, PATH, FILETIMESTAMP) values (@FILENAME, @PATH, @FILETIMESTAMP);", dbcon);
                param = dbAdapter.InsertCommand.Parameters.Add("@FILENAME", FbDbType.VarChar);
                param.SourceColumn = "FILENAME";
                param = dbAdapter.InsertCommand.Parameters.Add("@PATH", FbDbType.VarChar);
                param.SourceColumn = "PATH";
                param = dbAdapter.InsertCommand.Parameters.Add("@FILETIMESTAMP", FbDbType.TimeStamp);
                param.SourceColumn = "FILETIMESTAMP";
    
                dbAdapter.UpdateCommand = new FbCommand("UPDATE FILES SET FILENAME = @FILENAME, PATH = @PATH, FILETIMESTAMP = @FILETIMESTAMP;", dbcon);
                param = dbAdapter.InsertCommand.Parameters.Add("@FILENAME", FbDbType.VarChar);
                param.SourceColumn = "FILENAME";
                param = dbAdapter.InsertCommand.Parameters.Add("@PATH", FbDbType.VarChar);
                param.SourceColumn = "PATH";
                param = dbAdapter.InsertCommand.Parameters.Add("@FILETIMESTAMP", FbDbType.TimeStamp);
                param.SourceColumn = "FILETIMESTAMP";
    
                dbAdapter.DeleteCommand = new FbCommand("DELETE FROM FILES WHERE FILENAME = FILENAME AND PATH = @PATH;", dbcon);
                param = dbAdapter.InsertCommand.Parameters.Add("@FILENAME", FbDbType.VarChar);
                param.SourceColumn = "FILENAME";
    
                param = dbAdapter.InsertCommand.Parameters.Add("@PATH", FbDbType.VarChar);
                param.SourceColumn = "PATH";
                param = dbAdapter.InsertCommand.Parameters.Add("@FILETIMESTAMP", FbDbType.TimeStamp);
                param.SourceColumn = "FILETIMESTAMP";
    
            }
            public void load(DataGridView grid, string path)
            {
                if (dbcon == null) Con(path);
                dbcon.Open();
                data.Clear();
                dbAdapter.Fill(data);
    
                grid.AutoGenerateColumns = true;
                grid.DataSource = data;
                grid.Refresh();
    
                dbcon.Close();
            }
            public void writeDB(DataGridView grid)
            {
    
                try
                {
                    dbcon.Open();
                    dbAdapter.Update(data);
                    dbcon.Close();
                }
                catch (FbException e)
                {
                    dbcon.Close();
                 }
            }
            public void add(string file, string path, DateTime timestamp)
            {
                DataRow row = data.NewRow();
                row["FILENAME"] = file;
                row["PATH"] = path;
                row["FILETIMESTAMP"] = timestamp;
                data.Rows.Add(row);
            }
    
            public void deleteRow(DataRow row)
            {
    
            }
        }
    }
    
    public void writeDB(DataGridView grid)
            {
    
                try
                {
                    dbcon.Open();
                    dbAdapter.Update(data);
                    dbcon.Close();
                }
                catch (FbException e)
                {
                    dbcon.Close();
    
                     do nothing
                 }
            }
    

    Ich arbeite ja schon mit Update aber es funktioniert trotzdem nicht!

    mfg Zuluhutu



  • dbAdapter.UpdateCommand = new FbCommand("UPDATE FILES SET FILENAME = @FILENAME, PATH = @PATH, FILETIMESTAMP = @FILETIMESTAMP;", dbcon);
    param = dbAdapter.InsertCommand.Parameters.Add("@FILENAME", FbDbType.VarChar);
    

    Ich kenne mich mit dem Adapeter zwar nicht aus, aber warum weißt du hier erst UpdateCommand zu und verwendest nachher InserCommand ? Ist das so korrekt?



  • C# Code:
    dbAdapter.UpdateCommand = new FbCommand("UPDATE FILES SET FILENAME = @FILENAME, PATH = @PATH, FILETIMESTAMP = @FILETIMESTAMP;", dbcon);
    param = dbAdapter.InsertCommand.Parameters.Add("@FILENAME", FbDbType.VarChar);

    Ich kenne mich mit dem Adapeter zwar nicht aus, aber warum weißt du hier erst UpdateCommand zu und verwendest nachher InserCommand? Ist das so korrekt?

    Danke, das war der fehler! 😃

    mfg Zuluhutu



  • Warum erzeugst du eigentlich von Hand die Insert-, Update und Delete-Commands?
    Standardmäßig reicht die Übergabe des Select-Commands und der DB-Provider erzeugt daraus dann intern die passenden anderen Commands.


Anmelden zum Antworten