Einzelnen Beitrag anzeigen

FragenderHerbert

Registriert seit: 4. Dez 2013
47 Beiträge
 
#3

AW: ClientDataSet; Datenmenge wird ungewollt zur aktuellen hinzugefügt, warum?

  Alt 28. Jun 2014, 13:56
Du solltest erstmal bedenken, daß der Parameter "Field" nicht immer ein Feld enthalten muß und auch mal nil sein kann.
Ok, das könnte die Ursache meiner Exception sein. Ich habe stillschweigend vorausgesetzt, das der Event-Handler zwingend einen Feldinhalt übergibt und deshalb dort nicht gesucht.

  • erstmal sagt dir die Exception-Message, welche du uns vorenthälst, ganz bestimmt was von "Zugriffsverletzung bei Adresse $000000xx" und schon weiß man, daß da irgendwo ein NIL im Spiel ist
  • und wenn man den Debugger verwenden würde, dann würde man auch sehen, daß dieses Property bestimmt NIL sein wird
Und genau da ist das Problem! Wo ist irgendwo, wo ja der Nil Zeiger sein müsste?
Noch mal: Ich habe gar nicht mit irgendeinem NIL Zeiger gerechnet, da ich eine EDataBaseError Exception erhalten habe. Kann ja sein, das mein Konzept im Grundsatz schon falsch ist. Aber wie kann ich es dann besser machen. Eine Client-Server Architektur will ich absichtlich nicht, da ich mich noch nicht mal mit den elementarsten Grundlagen auskenne und auch die Delphi-Treff Tut-s hier nicht viel her geben.

Eine andere für mich hoch interessante Frage ist für mich im Gesamtzusammenhang: Wo finde ich ein einsteigerfreundliches Lehrbuch zu SQL Syntax. Möglichst MSSQL, da ich mich an CS Arcitekturen noch nicht heran traue und meine Medienverwaltung ausschließlich auf einem meiner lokalen Computer laufen soll, möglichst portabel auf einem USB Stick. Die Medienverwaltung soll deshalb keine vorinstallierten Datenbankserver voraussetzen. Leider kriege ich bei ADO den Verbindungsstring nicht "gebacken", ich erhalte dann Fehlermeldung, das die Tabelle nicht vorhanden ist. Ich habe da als Treiber den:

- OLE DB Simple Provider sowie den
- OLE DB Provider für Microsoft Directory Services

getestet.

Bei beiden kommt die Fehlermeldung "Tabelle nicht vorhanden"

Bei letzterem muss ich u.a. Datenquelle und Speicherort separat angeben.

Datenquelle -> meine Datenbankdatei
Speicherort -> mein Datenbankverzeichnis

Die Adresse 127.0.0.1 wird als Speicherort nicht akzeptiert. Daher habe ich "http://localhost" gar nicht erst probiert.

Ich will eine lokale Datenbank haben, da die für meine Zwecke komplett ausreicht und ich mir deshalb die Einarbeitung in CS Architekturen noch sparen möchte. Weil ich aber eine portable Anwendung will, scheidet BDE sofort aus. Bei Interbase bräuchte ich eine portable Version des Servers. Das hätte aber dann wohl zur Folge, das ich um die Erlernung der CS Architektur nicht herum käme.

Debuggen kann ich erst effektiv, wenn ich weiß, wo ich den Fehler suchen muss. Wenn ich den Fehlerort nicht eingrenzen kann, bin ich mit dem Test anderer DB Kompos genau so schnell oder gar schneller am Ziel.

Zitat:
Aber warum verwendest du nicht die Master-Detail-Funktionen des ClientDataSets, und lässt das automatisch synchronisieren?
  • IndexFieldNames
  • MasterFields
  • MasterSource
Doch, das habe ich schon erledigt. Alles im Objektinspector. Per Quelltext mache ich das zur Übung später, wenn ich das per OI geschafft habe.

Zitat:
Sicher, daß du Locate richtig verwendest, oder täuscht das nur und du hast eine etwas "eigenartige" Tabellenstruktur? (welche natprlich auch geheim ist)
  • ID als Feldname
Nein, bin ich nicht. Habe soeben das hier dazu gefunden:
http://www.delphipages.com/forum/showthread.php?t=41929

Da gibt es u.a. diesen Beitrag im Forum:

Zitat:
Change the comma to a semicolon in the Field string.
Example:

Locate('FIELD1;FIELD2;FIELD3',VarArrayOf([Value1,Value2,Value3]),[]);

Happy New Year
Christian
Allerdings brauche ich das variabel, das heißt -> Value1 muss der aktuelle Wert aus der Mastertabelle sein (CD0001,CD0002,DVD0001,USB-Stick0003,...)

Wenn aber der Parameter Field im Eventhandler der DataSource auch NIL sein kann?
Habe inzwischen den Quellcode schon in einen try except Block eingeschlossen. Aber mein EDatabaseError wird vor dem eingentlichen Start schon geworfen. Ich will aber, das in diesem Fall eben nix passiert. Wie aber stelle ich das an. Sorry, aber ich bin in Sachen Datenbank ein totales Greenhorn.

Bei dieser Gelegenheit frag ich gleich mal, wo gibt es denn wirklich einsteigerfreundliche Literatur zu Datenbanken? Ich habe außerdem Xampp auf meinem System installiert. Der beherrscht auch MySQL. Aber wo gibt es einsteigerfreundliche Tuts dazu?
  Mit Zitat antworten Zitat