Zum Inhalt springen
  • 0

C# Null-Variable an MySQL übergeben


Tician

Frage

Moinsen,

ich bin mal wieder am verzweifeln, seit heute morgen versuche ich eine Lösung für ein Problem zu finden, aber nichts funktioniert.

Folgende Situation: Ich habe ein C# Programm das eine XML-Datei ausließt, die Values innerhalb verschiedener Elemente in string-Variablen speichert und diese dann in eine (php) MySQL-Datenbank schreibt. Jetzt gibt es aber öfter leere Elemente in der XML die als "NULL" in der Datenbank stehen müssen, sonst gibt es im weiteren Prozess-ablauf (nicht mehr zum Programm gehörend) Probleme.

Ohne Veränderung: Wenn mein Programm ein Element einließt und dieses leer ist habe ich einen leeren string (""). Wenn ich diesen an die Datenbank übergeben (die wiederum einen integer für das Feld vorsieht) steht in dem Feld der Datenbank eine 0 (als Zahl).

Sieht so aus:

                        XmlNode package = node.SelectSingleNode("package");

                        if (package != null)
                            string secret = package["secret"].InnerText;

Das allein ist schon ein Problem, wenn der eingelesene String leer ist

Quasi so: <secret></secret>

kann ich nicht in einen int konvertieren: Convert.ToInt32("") -> Error

Der String für die Datenbank:

string command = "INSERT INTO test (un1) VALUES (" + secret + ");";

Das ist nur eine von vielen Variablen.

Was habe ich schon versucht?

 

1. Ich frage die string in einer if-abfrage ab ob sie leer sind und weise ihnen dann direkt null zu. War für mich das logischste.

if (string.IsNullOrEmpty(secret))
                        {
                            secret = null;
                        }

Dann sieht mein SQL-command aber übersetzt (überwachung der Variablen) so aus:

INSERT INTO test (un1) VALUES ();

Meine null-Variable verschwindet einfach und natürlich bekomme ich eine Exception geworfen.

 

2. Irgendwas im internet gefunden:

secret = string.IsNullOrEmpty(secret) ? null : secret;

Ich weiß weder was es macht, noch ob ich es richtig angewandt habe, ich habe das Fragezeichen noch nie gesehen und auch den Doppelpunkt nur bei der Vererbung von Klassen benutzt. Ich habe aber schon mit einem int? rumprobiert weil ich gelesen habe das es null-able ist - hat auch nicht geholfen wegen oben genanntem Problem der konvertierung.

Dann habe ich noch ewig mit den Konvertierungen rumgemacht und ausprobiert, aber jetzt bin ich auch mit den nerven am Ende.

 

Meine Mitarbeiter wollen das es funktioniert und ich sehe keine andere Möglichkeit mehr als den SQL-Befehl statt den Variablen anzupassen. Grund ist, dass wenn eine Variable beim Eintrag in die DB gar nicht angesprochen ist sie automatisch mit NULL drin steht. Bei 3 Variablen die nach null gefragt werden müssen sieht das so aus:

                        if (string.IsNullOrEmpty(secret1) && string.IsNullOrEmpty(secret2) && string.IsNullOrEmpty(secret3))
                        {
                            command = "INSERT INTO test () VALUES ();";
                        }
                        if (!string.IsNullOrEmpty(secret1) && string.IsNullOrEmpty(secret2) && string.IsNullOrEmpty(secret3))
                        {
                            command = "INSERT INTO test (secret1) VALUES (" + secret1 + ");";
                        }

Das mit jeder erdenklichen Möglichkeit ergibt 8 if-Abfragen, ich lasse quasi immer die Variablen weg die null sind. Bedenkt das da noch viel mehr Variablen sind deswegen ist der obere SQL-Befehl nur hier so "leer".

Ich bitte euch mal wieder instandig mir auf die Sprünge zu helfen. Wie mache ich aus einem leeren String eine Variable die meiner Datenbank NULL übergibt?

 

Grüße

Tician

Link zu diesem Kommentar
Auf anderen Seiten teilen

3 Antworten auf diese Frage

Empfohlene Beiträge

  • 5

So, der Reihe nach.

vor 34 Minuten schrieb Tician:

string command = "INSERT INTO test (un1) VALUES (" + secret + ");";

Das ist ganz, ganz schlechter Stil. Stichwort: SQL Injection

 

vor 34 Minuten schrieb Tician:

secret = string.IsNullOrEmpty(secret) ? null : secret;

Dinge benutzen die man nicht versteht ist immer schlecht.

Das ganze nennt sich Conditional Operator.

 

Zur Ursprungsfrage:

Wenn Du deine Querys sauber parametrisiert hast kannst Du sowas machen:

myCommandObject.Parameters.AddWithValue("@secret", string.IsNullOrWhiteSpace(secret) ? (object)DBNull.Value : secret);

Was es tut:

Der Conditional Operator prüft ob der String secret null, empty oder whitespace ist und übergibt in dem Fall DBNull.Value und falls er es nicht ist den String an den Parameter. Der Cast auf object ist notwendig da der Conditional Operator den Typen nicht erkennt, beide aber von object abgeleitet sind und damit die Generalisierung greift. 

Bearbeitet von a3quit4s
Ergänzende Erklärung
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...