Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Warum funktioniert mein ADO Command mit Parametern nicht?

119 views
Skip to first unread message

Norbert Pürringer

unread,
Sep 30, 2008, 10:24:06 AM9/30/08
to
Hallo Leute,

ich möchte gerne ein Command basierend auf einer Oracle Datenbank
ausführen. Das SQL Statement sieht wie folgt aus:

SELECT * FROM GDOSYS.GFIELDMAPPING WHERE OWNER = USER AND TABLE_NAME
= :param1 AND COLUMN_NAME = :param2

Leider bekomme ich beim Ausführen der unten angefügten Funktion die
Fehlermeldung:
ORA-01008: Nicht allen Variablen ist ein Wert zugeordnet.

Warum?

function _OpenParametrizedRecordset(const SQL, Param1, Param2:
WideString): IDispatch;
var
clsConnection: _Connection;
clsCommand: _Command;
clsParameters: Parameters;
clsParameter: Parameter;
oleAffectedRows: OleVariant;
begin
try
clsCommand := ADOInt.CoCommand.Create;
try
if Assigned(clsCommand) then begin
clsConnection := clsConnection_.NativeConnection;
clsParameters := clsCommand.Parameters;
try
if Assigned(clsConnection) then begin
clsCommand.Set_ActiveConnection(clsConnection);
clsCommand.CommandText := SQL;
clsCommand.CommandType := adCmdText;
if Param1 <> '' then begin
clsParameter := clsCommand.CreateParameter('param1',
adVarChar, adParamInput, 255, Param1);
clsParameters.Append(clsParameter);
clsParameter := nil;
if Param2 <> '' then begin
clsParameter := clsCommand.CreateParameter('param2',
adVarChar, adParamInput, 255, Param2);
clsParameters.Append(clsParameter);
clsParameter := nil;
end;
end;
clsCommand.Prepared := True;
Result := clsCommand.Execute(oleAffectedRows, EmptyParam,
adCmdText);
end;
finally
clsParameters := nil;
clsConnection := nil;
end;
end;
finally
clsCommand := nil;
end;
except
on e: Exception do begin
Result := nil;
_Log(' *** ERROR ***' + #9 + e.Message);
raise EOleSysError.Create
('Error executing SQL statement' + #13#10 + SQL + #13#10#13#10
+
e.Message, ERROR_OPEN_RECORDSET, 0);
end;
end;
end;

Gruß,
Norbert

Norbert Pürringer

unread,
Sep 30, 2008, 1:01:16 PM9/30/08
to
Hallo nochmals,

ich hab den Fehler gefunden. Statt :paramName Platzhalter muss man ?
Platzhalter verwenden.

Aber noch hab ich ein kleines Problem: Warum liefert mir RecordCount
des erstellten Recordsets immer -1 zurück? Auch wenn (not rs.Bof and
rs.Eof) gilt, gibt RecordCount einen falschen Wert zurück.

Dann würde ich gerne wissen, ob das cmd.Prepared = true auch bei
mehrmaliger Ausführung von SELECT-Statements Performance-Vorteile
bringt (nicht nur bei mehrmaligen INSERTs, etc.).

Danke,
Norbert

Lothar Armbrüster

unread,
Oct 1, 2008, 12:27:02 PM10/1/08
to
Norbert Pürringer <thal...@graffiti.net> writes:

> Hallo nochmals,
>
> ich hab den Fehler gefunden. Statt :paramName Platzhalter muss man ?
> Platzhalter verwenden.
>
> Aber noch hab ich ein kleines Problem: Warum liefert mir RecordCount
> des erstellten Recordsets immer -1 zurück? Auch wenn (not rs.Bof and
> rs.Eof) gilt, gibt RecordCount einen falschen Wert zurück.
>

Recordcount ist bei SQL-Datenbanken häufig im Provider nicht implementiert.
Der Server muss alle Datensätze durchlaufen, um die genaue Anzahl zu
ermitteln. Wenn Du Clientcursor verwendest, sollte Recordcount funktionieren,
aber dann werden immer alle Datensätze an den Client übertragen.
Wenn es Dir nur darum geht, zu wissen, ob überhaupt etwas da ist, reicht eine
Prüfung auf EOF nach dem Open.

> Dann würde ich gerne wissen, ob das cmd.Prepared = true auch bei
> mehrmaliger Ausführung von SELECT-Statements Performance-Vorteile
> bringt (nicht nur bei mehrmaligen INSERTs, etc.).
>

Das Prepared wird zumindest von der Datenbank unterstützt und bringt dort
auch Performancevorteile. Bei ADO weiß man aber nie so genau, ob alle
Features der Datenbank auch wirklich beim Client ankommen. ;-)

> Danke,
> Norbert

HTH,
Lothar

--
Lothar Armbrüster | lothar.ar...@t-online.de
Hauptstr. 26 |
65346 Eltville |

0 new messages