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
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
> 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 |