Einzelnen Beitrag anzeigen

Joerginger

Registriert seit: 22. Jan 2009
Ort: Wien
38 Beiträge
 
Delphi 7 Enterprise
 
#1

NULL Werte aus mySQL pro Feld entfernen

  Alt 2. Jun 2011, 13:56
Datenbank: mySQL • Version: 5.5 • Zugriff über: zu Fuss (Tutorial)
Hallo liebe mySQL / SQL Gurus,

ich hab einige Entwicklungen "draussen", die ich gerne von MS-SQL zu mySQL portieren würde. Man könnte fast sagen: Portieren muss... Mit dem DP-Tutorial zu mySQL ohne Controls habe ich mich so halbwegs angefreundet, da ich allerdings nicht gerade das große Licht des SQL bin scheitere ich bereits an einem relativ trivialen Problem:

Wenn ich auf die DB zugreife bekomme ich (logo) einen Satz mit vielen Feldern retour, welche bis auf wenige Ausnahmen natürlich auch NULL als Inhalt haben können. Ich denke dabei alleine schon mal an jede winzige Artikeldatei wo nicht in 10 VK-Preisen der Wert 0, sondern eben NULL drinsteht. Wenn ich jetzt (ohne vorher zu wissen, ob ein Wert oder eben NULL drinsteht) eine Typumwandlung versuche krachts... (Klar, könnte man mit try-except vielleicht sogar lösen...)

Anyway: bei M$-SQL habe ich (für jedes!!! Feld) ungefähr folgende Syntax einfließen lassen, um 100% eine Exception zu vermeiden, nämlich
Code:
if Not(varIsNull(dsADR.FieldValues['ADR_NAME1'])) then Form1.lstADR.Cells[1,iNR]:=dsADR.FieldValues['ADR_NAME1'];
if Not(varIsNull(dsADR.FieldValues['ADR_NAME2'])) then Form1.lstADR.Cells[2,iNR]:=dsADR.FieldValues['ADR_NAME2'];
if Not(varIsNull(dsADR.FieldValues['ADR_PLZ'])) then Form1.lstADR.Cells[3,iNR]:=dsADR.FieldValues['ADR_PLZ'];
mittels "if Not (varIsNull)" zu prüfen ob ein Wert drinsteht... Das klappt hervorragend. Zumindest in MS-SQL.

Mit mySQL habe ich (laut Tutorial von DP)
Code:
Exies[i].name1:=_myRow[1]; //NAME1
Exies[i].name2:=_myRow[2]; //NAME2
folgende Zuweisungen gebastelt, ok, hier zum Testen nur in ein Array hinein. Sobald ich aber ein Feld erwische - und derer gibt's Viele - die eben NULL behinhalten geht der Jammer los.

Mein erster Versuch wäre gewesen, das gleich wie im MS-SQL zu lösen
Code:
if not varIsNull(String(_myRow[3])) then Exies[i].birthday :=_myRow[3];          //GEBURTZELTAG
allerdings hängts da (scheinbar) daran, dass _myRow[3] - wie auch jedes andere Feld, das ich aus mySQL zurückbekomme - vom Typ PChar ist... jedenfalls: es kracht trotzdem. Die übliche "Zugriffsverletzung bei Adresse 0392814612348257812358"

Dann hab ich als Lösungsansatz gefunden, dass man unter mySQL IFNULL(FELD_NAME,'') sagen könnte... hm. Funktioniert zumindest

Jetzt meine eigentlichen Fragen:
- Wie gehe ich das am cleversten an? Ich meine, 100% dafür Sorge tragen dass alle Datensätze niemals irgendwo NULL in sich tragen kanns nich sein.
- Muss ich für jedes verwendete Feld im Select schon das erwähnte ISNULL(NAME,'') verwenden??? Sieht ja irgendwie nicht so dolle aus: SELECT IFNULL(ADR_NAME1,''''), IFNULL(ADR_NAME2,''''), ISNULL(ADR_STRASSE,'''')... Schreib das mal bei 30-50 Feldern
- ist das der "only way", muss ich mir da eine func schreiben die aus einem gegebenen Feldnamen das IFNULL(F_N,'''') bastelt und an's stringQUERY dranhängt???
- Oder gibts einen smooth-and-easy-Trick für meine Problemstellung?
- ist meine try-except-finally Idee möglicherweise doch nicht so blöde?

Bitte um Wortspenden/Codeschnipsel. Danke!

GLG, Mr. Joerginger
  Mit Zitat antworten Zitat