Thema: Delphi ADO Stored Procedure

Einzelnen Beitrag anzeigen

frankg

Registriert seit: 20. Mai 2003
Ort: Wetter
72 Beiträge
 
Delphi 7 Architect
 
#4

Re: negativ

  Alt 3. Jun 2003, 10:45
Zitat von toyoman:


funzt leider auch mit "normalen" namen nicht (ohne @).

hab noch ein attachment von der genauen fehlermeldung angehängt!

Hi Toyoman!

Unter ADO funktioniert das mit den Parametern ein bisschen anders als bei Datenbankaufrufen über die BDE. Innerhalb von ADO werden Parameter durch ein ? im SQL-String und die Position des Parameters in der Parameters-Liste des Command-Objektes definiert. Ich benutze immer folgenden Code, der ganz gut funktioniert (angenommen wir haben einer Prozedur spDoSomething mit dem Parameter Param1 dann kann man die Prozedur wie folgt aufrufen (ich gehe über direkte ADO-Programmierung weil in dbGO der ein oder andere Fehler drin ist. Wenn man ADO direkt anspricht läuft auch das Programm selbst schneller (frag mich nicht...) genaueres hierzu kannst Du in dem sehr guten Buch "ADO und Delphi" von Andreas Kosch finden (u.a. auch eine Art Benchmark...sehr interessant!)). Damit der Code funktioniert musst Du die Unit ADOInt in deine Uses-Klausel aufnehmen:

Delphi-Quellcode:
procedure CallSP;
var
  myCommand : ADOInt.Command;
  myParam : ADOInt.Parameter;
  RowsAffected : OleVariant;
begin
  // Command-Objekt erzeugen
  myCommand := CoCommand.Create;
  with myCommand do
    begin
      // Command-Objekt initialisieren
      CommandType := adCmdStoredProcedure;
      CommandText := 'spDoSomething';
      // Parameter erzeugen und an das Command-Objekt hängen
      myParam := CreateParameter('Param1',adChar,adParamInput,30);
      Parameters.Append(myParam);
      // Parameterwert setzen
      Parameters[0].Value := 'Hallo';
      // Connection setzen, über die der Befehl abgesetzt wird,
      // irgendwo im Programm muss es die Connection myADOConnection
      // geben, diese muss auch (soweit ich weiss) offen sein
      Set_ActiveConnection (myADOConnection);
      // In RowsAffected steht drin, auf wie viele Zeilen sich die
      // Prozedur ausgewirkt hat. Wenn es Records zurück gibt, dann
      // muss natürlich der letzte Parameter anders sein.
      Execute (RowsAffected,EmptyParam,adExceuteNoRecords);
    end;
  // Command-Objekt wieder freigeben
  myCommand.Free;
end;
Ich hoffe ich konnte Dir weiterhelfen

Viele Grüsse

Frank
  Mit Zitat antworten Zitat