Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

Gelöst von a3quit4s

Zur Lösung
  • Lösung

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.