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