AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Seltsamer Fehler bzgl. Parameterobjekt
Thema durchsuchen
Ansicht
Themen-Optionen

Seltsamer Fehler bzgl. Parameterobjekt

Ein Thema von Jumpy · begonnen am 7. Mai 2014 · letzter Beitrag vom 9. Mai 2014
Antwort Antwort
Seite 1 von 3  1 23      
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#1

Seltsamer Fehler bzgl. Parameterobjekt

  Alt 7. Mai 2014, 15:01
Datenbank: SQLServer • Version: ? • Zugriff über: ADO
Hallo,

ich bekomme bei einem einfachen Select eine Exception mit folgender Fehlermeldung:

Zitat:
Ein Parameterobjekt ist nicht ordnungsgemäß definiert. Inkonsistente oder unvollständige Informationen wurden angegeben.
Ich habe die Meldung natürlich gegoogelt, da war auch von einem Bug in ADO-Komponenten in älteren Delphis die Rede, aber da ging es um Inserts oder Updates und hatte was mit den Anführungsstrichen oder anderen Sonderzeichen zu tun.
Bei mir ist es aber nur ein Select und das SQL-Statement ist ohne Parameter, daher frage ich mich was der Fehler soll.
Die Meldung kommt mMn (ist innerhalb einer Webanwendung daher schlecht zu debuggen) nicht beim Öffnen der Abfrage sondern nach einem Locate und dem Auslesen eines Feldes der Datenmenge.

Jetzt der Clou(?): Der (Text-)Inhalt dieses Datenfeldes (mit dieser ID) enthält einen Doppelpunkt. Entferne ich in der Datenbank den Doppelpunkt in dem Feld dieses einen Datensatzes ist alles OK.
Also nicht Doppelpunkt im SQL-Statement, sondern im Ergebnis!

Wie kann das sein? Gibt es da noch einen anderen Bug (D6)?
Ralph
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#2

AW: Seltsamer Fehler bzgl. Parameterobjekt

  Alt 7. Mai 2014, 16:10
Wie lautet der SQL-Befehl?

Kannst Du nicht ein Beispielprojekt erstellen, in dem Du die Query exrahierst und eine Form mit einer TADOQuery erzeugst, dann ein Button, der das Teil öffnet und dann siehst du ja, wo es hängt.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Seltsamer Fehler bzgl. Parameterobjekt

  Alt 7. Mai 2014, 16:47
Ich vermute, daß das Problem im Locate steckt.
U.U. ist der Klartext
Code:
select id from data where text='mit doppelpunkt:'
und das wird dann als Parameter interpretiert.
Als workaround fällt mir ad hoc nur das durchscrollen per .Next und Pos ein, und das ist ja wahrhaftig nicht soo doll.
Kannst Du das ursprüngliche Select nicht so anpassen, daß Du das Locate nicht mehr benötigst?

Gruß
K-H

Nachtrag hast Du mal mit " und ' gespielt?
Da gibt es ja recht viele Seltsamkeiten
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 ( 7. Mai 2014 um 16:49 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#4

AW: Seltsamer Fehler bzgl. Parameterobjekt

  Alt 7. Mai 2014, 16:50
Wenn man sich den Code von 'Finde die Parameter im SQL-Text' anschaut, muss man sich nicht wundern.
Ob das am Locate liegt, würde ich dann bezweifeln. Abhilfe: den Suchtext mit dem Doppelpunkt als Parameter deklarieren,
also
Delphi-Quellcode:
ADOQuery.SQL.Text = 'select * from tabelle where feld = :ParamMitDoppelPunkt';
ADOQuery.Parameter['ParamMitDoppelPunkt'] := 'Der Text mit dem Doppelpunkt: ';
Achtung! Pseudocode. Hab hier kein Delphi.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Seltsamer Fehler bzgl. Parameterobjekt

  Alt 7. Mai 2014, 17:06
Hast Du vllt. den Gag übersehen?
Jetzt der Clou(?): Der (Text-)Inhalt dieses Datenfeldes (mit dieser ID) enthält einen Doppelpunkt. Entferne ich in der Datenbank den Doppelpunkt in dem Feld dieses einen Datensatzes ist alles OK.
Also nicht Doppelpunkt im SQL-Statement, sondern im Ergebnis!
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

AW: Seltsamer Fehler bzgl. Parameterobjekt

  Alt 7. Mai 2014, 17:10
Die genaue Abfrage würde uns aber wirklich weiterhelfen.
Markus Kinzler
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#7

AW: Seltsamer Fehler bzgl. Parameterobjekt

  Alt 8. Mai 2014, 06:54
Hast Du vllt. den Gag übersehen?
Nope. Aber Du schreibst.
U.U. ist der Klartext
Code:
select id from data where text='mit doppelpunkt:'
und das wird dann als Parameter interpretiert.
Und darauf bin ich dann eingegangen. Wenn hier also einer den Gag nicht verstanden hat, dann... ach ist doch egal.

Wenn man das allerdings ausprobiert, sieht man, das alles wie gewünscht funktioniert.

Die vom Fragesteller beobachtete Problematik kenne ich nicht und kann mir das auch nicht vorstellen, denn die Query wird vor der Ausführung geparst, ergo beziehen sich alle Probleme bezüglich der Parameter auf den Zeitpunkt *vor* der Ausführung.

Was sein kann ist, das das Dataset mit einem anderen Dataset verknüpft ist und dort dann der Hund begraben liegt. Man kann die ja so verknüpfen, das beim Record-Wechsel in DS1 eine neue parametrierte Query DS2 ausgeführt wird (Datasource-Eigenschaft von DS2 setzen. Dann könnte ein 'Locate' im DS1 zu Problemen führen (wenn die Query in DS2 fehlerhaft ist). Soweit ich mich erinnere muss der Parameter in DS2 einem Feldnamen in DS1 entsprechen.

Aber das ist alles nur Ratenspiel bzw. müsste man das ausprobieren, aber dazu habe ich jetzt keine Lust.
Delphi-Quellcode:
DS1 := 'Select MasterID, moreData from MasterTable';
DataSource1.Dataset := DS1;
DS2.DataSource := DataSource1;
DS2.SQL.Text := 'Select * from Details where MasterID = :MasterID';
Das mal testen. Und dann im DS2.SQL den Parameternamen ändern oder ein Leerzeichen zwischen ':' und 'M' setzen (damit das zu Problemen führt). Dann DS1 öffnen und wieder per Locate wechseln (obwohl das Locate überflüssig wäre, denn es knallt schon beim Öffnen von DS2)

Geändert von Dejan Vu ( 8. Mai 2014 um 06:57 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#8

AW: Seltsamer Fehler bzgl. Parameterobjekt

  Alt 8. Mai 2014, 07:58
Sorry, war gestern nicht mehr online und konnte das nicht weiter ausführen.

Die Tabelle enthält Textbausteine für meine Web-CGI, quasi ein Mini-CMS für Arme.
Sobald aus dem Webrequest ersichtlich ist, welche neue Web-Seite angefordert wurde, wird die Query geöffnet, die da lautet:

SQL-Code:
Select * From
  Webtexte
Where
  Seite='*'
  or Seite='Name der angeforderten Seite'
  or Kategorie='Menuitem'
Das einzige was an dem Statement variabel ist ist der Name der angeforderten Seite. In Delphi sieht die Stelle so as:

Code:
Webtexte.SQL.Add('or Seite = ');
Webtexte.SQL.Add(QuotedStr(GetPagename(RequestedPage)));
Die GetPagename-Funktion liefert nur definierte Namen zurück, so dass ich mich nicht um SQL-Injektion o.ä. sorgen musste und keine Parameter benutze!
Wie man sieht enthält auch die Where-Klausel keinen Vergleich mit einem Text der einen Doppelpunkt enthält.

Es gibt dann eine Funktion, die aus der bereits ohne Fehler geöffneten Datenmenge einen Textbaustein anhand der ID sucht und in dieser tritt mMn der Fehler auf. Sinngemäß (hab Delphi noch nicht auf):

Delphi-Quellcode:
function GetContentFromID(ID:String):String;
begin
  if Webtexte.Active then
    begin
    Webtexte.Locate('ID',ID,[]);
    Result:=Webtexte.FieldByName('DE').AsString;
    end;
end;
Es werden während der Laufzeit der CGI mehrere Textbausteine mit verschiedenen ID's aus der Datenmenge geladen, daher weiß ich, dass diese sich auf jeden Fall öffnet. Nur halt der eine Datensatz, der einen Doppelpunkt enthält, macht halt Probleme. Der Text in dem Datensatz ist:
"Gehen Sie dabei wie folgt vor:"
Laß ich den Doppelpunkt weg, funzt halt alles.

Ich hoffe so wird klarer warum ich das nicht nachvollziehen kann.
Ralph

Geändert von Jumpy ( 8. Mai 2014 um 08:00 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

AW: Seltsamer Fehler bzgl. Parameterobjekt

  Alt 8. Mai 2014, 08:13
Vor Seite fehlt höchstwahrscheinlich ein Leerzeichen, bze es schadet nicht dort eins einzufügen

Webtexte.SQL.Add(' or Seite = '); Zudem würde ich, wie auch schon mehrmals genannt, Parameter verwenden!
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.763 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Seltsamer Fehler bzgl. Parameterobjekt

  Alt 8. Mai 2014, 08:33
Dadurch das SQL.Add eine neue Zeile (tatsächlich einen neuen String in die StringListe, ich weiss) einfügt ist das Leerzeichen vor dem 'or' überflüssig.
Es sei denn natürlich, die verwendeten DB-Komponenten klöppeln daraus einen einzigen zusammenhängenden (nicht durch CR getrennten) String.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  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 03:04 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