Warum funktioniert mein ADO Command mit Parametern nicht?

30/09/2008 - 16:24 von Norbert Pürringer | Report spam
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
 

Lesen sie die antworten

#1 Norbert Pürringer
30/09/2008 - 19:01 | Warnen spam
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

Ähnliche fragen