AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi HELP ! Stored Procedures angelegt, Aufruf mißlingt !
Thema durchsuchen
Ansicht
Themen-Optionen

HELP ! Stored Procedures angelegt, Aufruf mißlingt !

Ein Thema von lemmond1976 · begonnen am 13. Jun 2003 · letzter Beitrag vom 20. Jun 2003
Antwort Antwort
lemmond1976

Registriert seit: 10. Mai 2003
21 Beiträge
 
#1

HELP ! Stored Procedures angelegt, Aufruf mißlingt !

  Alt 13. Jun 2003, 17:24
Hallo,

ich bin es nochmal und habe einen neuen Thread aufgemacht.
Ich habe ein echtes Problem an der Backe.
Als Server benutze ich MS SQL 7.0.
Der Zugriff erfolgt über ADO.
TADOStoredProc ist ja wohl dazu da, gespeicherte Prozeduren ohne Ergebnismengen (also Insert, Create, Update..) aufzurufen.

Die Prozedur habe ich im Objekt-Inspektor ausgewählt.
Folgender Code funktioniert auch:

Code:
AdoStoredProc1.Parameters.parambyname('@Feld').Value := 'Wert1';
.......
Das EXECPROC danach macht aber Schwierigkeiten, sodaß es zu folgender Fehlermeldung kommt:

Zitat:
ODBC MSQL Server Das optionale Feature ist nicht implementiert.
Das wäre der erste Punkt, der geklärt werden müßte.
Bei ergebnismengenorientierten Abfragen (Select etc.) kann man die Prozedur wie eine normale Tabelle behandeln.
Also zum Beispiel so:

Select * from test_procedure

Ich brauche dazu ja wohl ein ADODataSet und eine Query.
Und wie muß ich diese beiden im Objekt-Inspektor miteinander verbinden, daß
die Query das Ergebnis der Prozedur zurückliefert ?
Sind also nur zwei Fragen..
Wäre also wirklich klasse, wenn einer ne Antwort parat hätte.
Komme nämlich echt nicht weiter.

Danke !

Gruss

Ich habe schon überall nachgeschaut, dieses Forum ist hier eigentlich die einzige Möglichkeit, dieses Scheiß-Problem zu beseitigen, da ich selbst an die Grenzen meiner Möglichkeiten gestoßen und etwas frustriert bin.
Gunnar
  Mit Zitat antworten Zitat
frankg

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

Re: HELP ! Stored Procedures angelegt, Aufruf mißlingt !

  Alt 20. Jun 2003, 14:42
Hallo Gunnar!

Ich habe mal ein paar Anmerkungen zu Deinem Posting geschrieben
Zitat von lemmond1976:
TADOStoredProc ist ja wohl dazu da, gespeicherte Prozeduren ohne Ergebnismengen (also Insert, Create, Update..) aufzurufen.
Eigentlich nicht! Die Komponente TADOQuery, TADOTable und TADOStoredProcedure sind eigentlich nur als Rückwärtskompatibilitätskomponenten zu den BDE-Äquivalenten gedacht, d.h. sie sollen Dir helfen, ein BDE-Programm (relativ einfach) nach ADO zu portieren, indem Du einfach nur die BDE-Komponenten durch die ADO-Komponenten ersetzt. Wenn Du ein natives ADO-Programm verwendest, solltest Du (nach Meinung von Borland) die Komponente TADODataset verwenden, was im Prinzip die Funktionalitäten der drei Komponenten beinhalten. Leider hat man dieses wohl bei Borland nicht so optimal implementiert, so dass TADODataset wohl ein paar Probleme macht und ausserdem auch noch langsamer ist als ein direkter ADO-Zugriff (im Buch "ADO und Delphi" von Andreas Kosch ist ein sehr interessanter Benchmark zu diesem Thema drin). Ich bevorzuge beim Aufrufen von Stored Procedures über ADO folgende Vorgehensweise:

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 := adCmdStoredProc;
      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;
Zitat von lemmond1976:
ODBC MSQL Server Das optionale Feature ist nicht implementiert.
Ist das nur die Fehlermeldung oder verwendest Du tatsächlich einen ODBC-Treiber zum Zugriff auf den SQL-Server. Sollte das der Fall sein, so solltest Du schnell den OLE DB-Provider für MSSQL verwenden. Generell gilt, gibt es einen OLE DB-Provider dann sollte dieser verwendet werden, weil er viel schneller arbeitet als ODBC. ODBC-Treiber sollte man unter ADO nur dann verwenden, wenn es keinen OLE-DB Provider gibt.

[quote="lemmond1976"]
Bei ergebnismengenorientierten Abfragen (Select etc.) kann man die Prozedur wie eine normale Tabelle behandeln.
Also zum Beispiel so:

Select * from test_procedure

Ich brauche dazu ja wohl ein ADODataSet und eine Query.
Und wie muß ich diese beiden im Objekt-Inspektor miteinander verbinden, daß die Query das Ergebnis der Prozedur zurückliefert ?
[/qoute]

Wenn ich mich nicht ganz irre, dann kann man den obigen Code folgendermassen erweitern, um die Rückgabemenge der Stored Procedure in einem Recordset zu speichern:

Delphi-Quellcode:
procedure CallSPmitRS;
var
  myCommand : ADOInt.Command;
  myParam : ADOInt.Parameter;
  myRS : ADOInt.RecordSet;
  RowsAffected : OleVariant;
begin
  // Command-Objekt erzeugen
  myCommand := CoCommand.Create;
  with myCommand do
    begin
      // Command-Objekt initialisieren
      CommandType := adCmdStoredProc;
      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.
      myRS := Execute (RowsAffected,EmptyParam,adOptionUnspecified);
    end;
  // Command-Objekt wieder freigeben
  myCommand.Free;
end;
In myRS steht dann die Ergebnismenge der Stored Procedure drin. Müsste klappen, aber ich weiss das gerade nicht zu 100%.

Viele Grüsse

Frank
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:52 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