Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ADODataSet.Open: Mal Fehler, mal nicht. Voraussetzung gleich (https://www.delphipraxis.net/137683-adodataset-open-mal-fehler-mal-nicht-voraussetzung-gleich.html)

Christian Seehase 26. Jul 2009 17:01

Datenbank: MS SQL-Server • Version: 2000 • Zugriff über: ADO

ADODataSet.Open: Mal Fehler, mal nicht. Voraussetzung gleich
 
Moin Zusammen,

ich habe einen TADODataSet, der wie folgt vorbereitet wird:
Delphi-Quellcode:
        LRSSelectTyp              := TADODataSet.Create(nil);
        LRSSelectTyp.CommandText  := 'SELECT ID FROM Typ WHERE Typ = :prmTyp';
        LRSSelectTyp.Parameters.ParseSQL(LRSSelectTyp.CommandText,true);
        LRSSelectTyp.ParamCheck   := true;
        LRSSelectTyp.Connection   := conMain;
Die Abfrage erfolgt dann mit (AsTyp ist ein Parameter vom Typ string):
Delphi-Quellcode:
        LRSSelectTyp.Parameters.ParamByName('prmTyp').Value := AsTyp;
        LRSSelectTyp.Open;
Die Spalte Typ hat den Datentyp varchar mit der Länge 50, ausserdem ist die Einschränkung UNIQUE für die Spalte aktiv.

Wenn AsTyp einen Leerstring enthält, bekomme ich eine Exception:
Zitat:

Die Datentypen text, ntext und image können nur mithilfe des Operators IS NULL oder LIKE verglichen oder sortiert werden.
Ich benutze den Code beim Einlesen von Dateien.

Was ich mir nicht erklären kann:
Es kann diverse Male ein Leerstring benutzt werden, ohne das die Exception auftritt.
Der Fehler tritt erst bei einer bestimmten Datei auf, wobei es aber keine Rolle spielt, ob ich mit der Datei anfange, oder ob sie erst später an die Reihe kommt.

Hat jemand eine Erklärung für dieses Verhalten?

nahpets 27. Jul 2009 09:46

Re: ADODataSet.Open: Mal Fehler, mal nicht. Voraussetzung gl
 
Hallo,

der Versuch einer Hilfestellung:

Was genau steht in AsTyp? Eine Zeichenfolge, dann muss der Parameter in Hochkommata stehe, da ansonsten das SQL mit dem = endet und daher ungültig wird.
Wenn Du also einen Leerstring übergeben musst, so müsstest Du das = durch IS Null ersetzen oder eventuell wenn AsTye leer ist, diesem ein Blank zuweisen oder eine Zeichenfolge, die in den Daten garantiert nicht enthalten ist.

Besser wäre jedoch, abhängig davon, ob AsTyp leer ist oder nicht, unterschiedliche SQL-Statements zu verwenden, das vorhanden, wenn AsTyp nicht leer ist, ansonsten
SQL-Code:
SELECT ID FROM Typ WHERE Typ is null
Eventuell reicht aber auch ein
Delphi-Quellcode:
LRSSelectTyp.Parameters.ParamByName('prmTyp').Value := QuotedStr(AsTyp);

sx2008 27. Jul 2009 10:15

Re: ADODataSet.Open: Mal Fehler, mal nicht. Voraussetzung gl
 
Als Allererstes immer das Connection-Property zuweisen.
Nur dann kann die unterliegende Treiberschicht den korrekten Datentyp des Parameters ermitteln.
Delphi-Quellcode:
LRSSelectTyp              := TADODataSet.Create(nil);
LRSSelectTyp.Connection   := conMain;
LRSSelectTyp.CommandText  := 'SELECT ID FROM Typ WHERE Typ = :prmTyp';
LRSSelectTyp.Parameters.ParamValues['prmTyp'] := AsTyp;
LRSSelectTyp.Open;

Christian Seehase 27. Jul 2009 17:07

Re: ADODataSet.Open: Mal Fehler, mal nicht. Voraussetzung gl
 
Hallo Ihr beiden,

danke für die Tips, die werde ich gleich mal ausprobieren.
Was ich halt nur nicht verstehe, warum es mal funktioniert, und mal nicht. Vor allem: Es fängt immer bei den gleichen Ausgangsdaten an, egal, ob die nun als erstes zur Verfügung stehen, oder später...
Bei 500 Sätzen, bei denen ein Leerstring übergeben wird, geht es nur 10 mal schief :gruebel:

Christian Seehase 27. Jul 2009 21:12

Re: ADODataSet.Open: Mal Fehler, mal nicht. Voraussetzung gl
 
Moin Zusammen,

so, ich konnte das Problem lösen, auch wenn mir die Ursache immer noch nicht klar ist.

Als erstes habe ich die Zuweisung der Connection verschoben:
Keine Änderung.

Dann habe ich es mit AnsiQuotedStr versucht:
Kein Erfolg, was bei näherer Betrachtung auch nicht funktionieren konnte.
Werden Parameter verwendet, wird durch die Verwendung von (Ansi)QuotedStr nicht nur der eigentliche Wert, sondern der Wert zuzüglich der ' zu Beginn und Ende des Strings geschrieben. Ein Leerstring wird also als '' gespeichert, nicht als Leerwert.

Danach habe ich dann die Spalte Typ umbenannt, um ein Problem mit dem gleichen Namen von Tabelle und Spalte auszuschliessen.
Auch kein Erfolg.

Anschliessend habe ich dann die LRSSelectTyp.Parameters.ParseSQL(LRSSelectTyp.Comm andText,true); Zeilen weggelassen.
Diese hatte ich nur reingenommen, da die Parameterliste immer leer war.
Nachdem die Connection-Zuweisung nach oben "gewandert" war, waren die Parameter aus den jeweiligen CommandText-Zeilen aber korrekt enthalten, so dass die Zeilen entfallen konnten.
Jetzt funktioniert alles wie es soll ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:06 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