Laden...

Parameter angeblich immer NULL

Erstellt von Andy1988 vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.161 Views
Andy1988 Themenstarter:in
79 Beiträge seit 2004
vor 16 Jahren
Parameter angeblich immer NULL

Also,
Ich versuche einfach nur eine Update- oder Insert-Query an eine Datenbank über 2 Funktionen zu senden.
Da das ganze Zeug von Threads aufgerufen wird, locke ich einfach die SQL Connection, damit der Rest schön Schlange steht.
Nun das Problem:

Die Tabelle performedchecks besteht aus 4 Feldern:
-ID (INT Autoincrement, brauch mich nicht zu jucken)
-checkId (INT Referenz auf einen anderen Datensatz in anderer Tabelle, NOT NULL)
-result (VARCHAR NOT NULL)
-time (einfaches DATETIME NOT NULL)

Die letzten 3 Felder werden in den Querys benötigt.
Allerdings wird mir immer wieder in einer MySqlException gesagt, dass checkId nicht NULL sein darf.
Und ich setz ja vorher den Parameter. Und die ID, die oben an der Methode ankommt stimmt auch. Das hab ich mit dem Debugger getestet.
Allerdings weiß ich auch nicht, was ich da als MySqlDbType bei der checkId wählen soll: Int16, Int24, Int32 oder Int64?
Keine Ahnung, wo da ein Fehler sein soll.
Könnt ihr mir da mal ein wenig unter die Arme greifen?

        public void addPerformedTask(int id, string result, DateTime time)
        {
            lock (this._con)
            {
                string query = "INSERT INTO performedchecks (checkId, result, time) VALUES ( @checkId, @result, @time )";
                MySqlCommand cmd = this._con.CreateCommand();
                cmd.CommandText = query;

                cmd.Parameters.Add("@checkId", MySqlDbType.Int16);
                cmd.Parameters.Add("@result", MySqlDbType.VarChar);
                cmd.Parameters.Add("@time", MySqlDbType.Datetime);

                cmd.Parameters["@checkId"].Value = id;
                cmd.Parameters["@result"].Value = result;
                cmd.Parameters["@time"].Value = time;

                cmd.ExecuteNonQuery();
            }
        }

        public void updatePerformedTask(int id, string result, DateTime time)
        {
            lock (this._con)
            {
                string query = "UPDATE performedchecks SET result = @result, time = @time WHERE checkId = @checkId";
                MySqlCommand cmd = this._con.CreateCommand();
                cmd.CommandText = query;

                cmd.Parameters.Add("@checkId", MySqlDbType.Int16);
                cmd.Parameters.Add("@result", MySqlDbType.VarChar);
                cmd.Parameters.Add("@time", MySqlDbType.Datetime);

                cmd.Parameters["@checkId"].Value = id;
                cmd.Parameters["@result"].Value = result;
                cmd.Parameters["@time"].Value = time;

                cmd.ExecuteNonQuery();
            }
        }

edit:
Grrrrr....
Habs hinbekommen.
MySQL will bei Parameterized Querys kein @ vor den Parametern, sondern ein ?.
Wieso macht man sowas? 😁

476 Beiträge seit 2004
vor 16 Jahren

hallo Andy1988,

beim OLE DataProvider (um beispielsweise auf eine Access-Datenbank) zuzugreifen wird ebenfalls nur ein "?" anstatt einem "@parametername" für den Parameter angegeben. Hierbei ist es wichtig die Reihenfolge strikt einzuhalten sonst kann man mitunter auch mal böse Überraschungen erleben.

-yellow

Selbst ein Weg von tausend Meilen beginnt mit einem Schritt (chinesisches Sprichwort).

Mein Blog: Yellow's Blog auf sqlgut.de