AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken NULL Werte aus mySQL pro Feld entfernen
Thema durchsuchen
Ansicht
Themen-Optionen

NULL Werte aus mySQL pro Feld entfernen

Ein Thema von Joerginger · begonnen am 2. Jun 2011 · letzter Beitrag vom 3. Jun 2011
Antwort Antwort
Seite 1 von 3  1 23      
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
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: NULL Werte aus mySQL pro Feld entfernen

  Alt 2. Jun 2011, 14:04
-Andere Komponenten verwenden
-DB-seitig Views verwenden
Markus Kinzler
  Mit Zitat antworten Zitat
Joerginger

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

AW: NULL Werte aus mySQL pro Feld entfernen

  Alt 2. Jun 2011, 14:13
Herzlichen Dank für die rasche Antwort, leider bin ich - wie erwähnt - eher Anfänger und kenn mi jetzt erst recht nicht aus...

Was andere Komponenten sind ist mir klar, hast Du / hat jemand einen Tip Welche Komponenten ich da verwenden soll(te)?

Was um alles in der Welt (Newbie-Alarm!!!) sind "DB-seitig Views"?

GLG, Joerginger
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: NULL Werte aus mySQL pro Feld entfernen

  Alt 2. Jun 2011, 14:20
Ein View ist eine Abfrage auf dem Server, auf dem man wie eine Tabelle zugreifen kann.

Komponenten gibt es Viele. Wie hast du auf MSSQL zugegriffen? ADO? Darf es etwas kosten?

Zeos, MyDAC, dbExpress, ...
Markus Kinzler
  Mit Zitat antworten Zitat
Joerginger

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

AW: NULL Werte aus mySQL pro Feld entfernen

  Alt 2. Jun 2011, 15:05
Oh, danke für die Infos.

Meine Programmierphilosophie (und leider bin ich mit 46 Jahren schon seeeehr lange dabei) ist immer (noch): Was ich selber schreibe, kann ich auch selber korrigieren. MS-SQL greife ich via ADODB und DB zu, alles handgestrickt, keine Controls. ADOQUERY erzeugen, SQL-String absetzen, glücklich sein... Ich denke es ist zwar schwieriger als Klick Klick Programm fertig, aber eben auch wesentlich flexibler. Daher hab ich mich dann in das DP-Tutorial eingelesen "mySQL ohne Komponenten", dort greife ich dann auch über die mysql.pas direkt auf die DB zu, via libmysql.dll

Scheint mir sehr flott zu sein und wäre im Prinzip auch praktikabel. So exzessive G'schichten mach ich nicht. Bisschen Daten reinklopfen, Abfragen über 2,5 Millionen Adressen nach div. Kriterien. Oder in meiner Gastro-Lösung werden eben Zeilen mit Bestellungen und Abrechnungen gebucht.

Da MS-SQL bei 5 Usern in der Mini-Version sperrt, ich aber einige Kunden habe die zumindest 6-15 User benötigen... stehe ich vor der Entscheidung ob ich auf mySQL umsteige oder den Kunden (versuche) MS-SQL in "nicht gratis" umzuhängen...

Aber ich sehe grad wieder mal, dass ich um einen guten SQL-Kurs nicht herumkommen werde. Da fehlt mir einfach noch zu viel des Wissens...

GLG, Joerginger
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: NULL Werte aus mySQL pro Feld entfernen

  Alt 2. Jun 2011, 15:09
Per ADO sollte der Zugriff auf MySQL auch möglich sein.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#7

AW: NULL Werte aus mySQL pro Feld entfernen

  Alt 2. Jun 2011, 18:23
Ich denke deinem Problem kann man mit einer supersimplen Funktion begegnen:
Delphi-Quellcode:
function Coalesce(Value:Variant; default:Variant):Variant;
begin
  if VarIsNull(Value) then
    result := default
  else
    result := Value;
end;
Damit kann du nun so arbeiten:
Delphi-Quellcode:
Exies[i].name1:= Coalesce(_myRow[1], ''); //NAME1
Exies[i].name2:= Coalesce(_myRow[2], ''); //NAME2
Exies[i].Preis:= Coalesce(_myRow[3], 0.0); //VK Preis
Exies[i].Flag:= Coalesce(_myRow[4], False); //boolean Flag
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: NULL Werte aus mySQL pro Feld entfernen

  Alt 2. Jun 2011, 18:28
Wenn ich richtig verstanden habe, knallt es aber schon beim Zugriff auf
_myRow[<index>]
Markus Kinzler
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#9

AW: NULL Werte aus mySQL pro Feld entfernen

  Alt 2. Jun 2011, 18:32
Da MS-SQL bei 5 Usern in der Mini-Version sperrt, ich aber einige Kunden habe die zumindest 6-15 User benötigen... stehe ich vor der Entscheidung ob ich auf mySQL umsteige...
Wenn schon Umstieg, warum nicht auf Firebird oder PostgreSQL? Mit MySQL handelst du dir da nur die Lizenzproblematik ein. Gerade wenn es um Geld geht -> Firebird oder PostgreSQL.
  Mit Zitat antworten Zitat
Joerginger

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

AW: NULL Werte aus mySQL pro Feld entfernen

  Alt 2. Jun 2011, 18:42
sx2008's Idee wäre durchaus gut, aber wie mkinzler schon richtig bemerkt hat, pfeffert es das Programm sofort auf, wenn ich versuche _myRow[<Index>] in irgendeiner Form abzufragen oder umzuwandeln, dieweil's vom Typ her PChar ist (Für die Lesbarkeit meines Codes ist's allerdings ein Segen, diese Prüfung als eigene function auszuführen und aufzurufen...)

@omata: hat natürlich auch andere Gründe, warum ich mySQL präferiere. Z.B: Du kannst eine NAS (von QNAP) hernehmen und schwupps, mySQL läuft drauf. Und auch 2 oder 3 Systeme, die ich zur Wartung übernehmen werde (darunter auch ein Ärztepaket / Ordiverwaltung) hat als Basis mySQL... Inwiefern meinst Du "wenn es um's Geld geht"???

Prinzipiell gefällt mir ja der Zugriff ohne Komponenten total gut und (sogar über's Netzwerk) geht das Teil extrem flott, mit genau einer solch erwähnten NAS

GLG, Mr. Joerginger
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz