AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi ADODataSet.Open: Mal Fehler, mal nicht. Voraussetzung gleich
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Christian Seehase · begonnen am 26. Jul 2009 · letzter Beitrag vom 27. Jul 2009
Antwort Antwort
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#1

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

  Alt 26. Jul 2009, 17:01
Datenbank: MS SQL-Server • Version: 2000 • Zugriff über: ADO
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?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

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

  Alt 27. Jul 2009, 09:46
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, ansonstenSELECT ID FROM Typ WHERE Typ is null Eventuell reicht aber auch einLRSSelectTyp.Parameters.ParamByName('prmTyp').Value := QuotedStr(AsTyp);
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

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

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

  Alt 27. Jul 2009, 10:15
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;
fork me on Github
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 27. Jul 2009, 17:07
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
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#5

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

  Alt 27. Jul 2009, 21:12
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
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:20 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