![]() |
ADO Stored Procedure
hallo :D
kennt sich jemand aus auf dieser welt mit stored procedures? wir versuchen bereits vorhandenen stored procedures auf einem SQL Server 2000 mit Delphi 7 Enterprise die parameter fürs ausführen der stored procedure mitzugeben. wie die syntax lauten sollte haben wir mitlerweile rausgefunden, irgendwie so: adostoredproc1.parameters.parambyname('parameterna me').value:= die parameter auf dem SQL Server sind benamst mit einem @-Zeichen zu beginn: also zum beispiel so: @getPruefCode unser Programmcode wird kompiliert alles scheint zu funzen, wir können auch daten auslesen aus der stored procedure. versuchen wir allerdings den parameter zu übergeben meldet delphi, der Parameter würde nicht gefunden werden. im kleinen dialogfenster der komponente (adostoredproc1) kann man die parameter aber tip top anschauen und bearbeiten. was kann das für ein problem sein? :roll: gruss |
Hallo toyoman,
was ADO betrifft bin ich nicht so sehr "beleckt". Du schreibst, dass die Parameter der SP auf dem SQL-Server mit "@" anfangen. Es kann sein, dass sich Delphi daran stört. Object Pascal identifiziert Variablen, die ein "@" vorangestellt haben, als Adressoperatoren. Vielleicht ist das das Problem, auch wenn der Parametername als String übergeben wird ... Probier's doch einfach mal, die SP ohne "@"-Variablen zu definieren. Weisheit Ende ... |
negativ
Liste der Anhänge anzeigen (Anzahl: 1)
:(
funzt leider auch mit "normalen" namen nicht (ohne @). hab noch ein attachment von der genauen fehlermeldung angehängt! :shock: |
Re: negativ
Zitat:
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:
Ich hoffe ich konnte Dir weiterhelfen
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; Viele Grüsse Frank |
dankschön
hallo frank
du glaubst nicht wie super es ist so eine antwort zu bekommen nach 2 wochen suchen :) muss es aber zuerst austesten, bin aber zuversichtlich sieht gut aus! danke!!!! toyoman |
Re: dankschön
Zitat:
Klar weiss ich das :D . Leider habe ich auf meine Frage (Intraweb) bisher noch keine Antwort bekommen :( . Naja, das wird schon noch. Also der Code funzt bei mir. Wenn Du Dich intensiv mit ADO beschäftigen möchtest, dann hol Dir auf jeden Fall mal das Buch von Andreas Kosch. Ist wirklich klasse. Nachdem ich das gelesen habe habe ich erstmal einen grossen Teil meiner Datenzugriffsobjekte für mein aktuelles Projekt umgeschrieben, so dass dbGO gar nicht mehr verwendet wird. Viele Grüsse Frank |
intraweb
:?
hab mir deinen beitrag/frage über Intraweb gerade angeguckt.. aber leider kenn ich mich damit auch nicht aus. :( hab noch nie was mit intraweb oder so gemacht... sorry :angle2: |
Hilfe
hallo frank
Dein Beispielcode funktioniert nicht. wir kriegen einen kompilierungsfehler bei der Zeile: commandtype:=adCmdStoredProcedure; Delphi sagt er kenne den Begriff adCmdStoredProcedure nicht! die Unit adoint haben wir eingefügt. weisst du an was das liegen kann? Gruss und danke :coder: |
Re: Hilfe
Hallo Toyoman!
Zitat:
Delphi-Quellcode:
Tut mir leid, dass ich mich da vertippt habe. Wenn Du selbst so etwas rausfinden möchtest, guck Dir doch einfach mal den Source von ADOInt.pas an. Da steht alles drin.
commandtype := adCmdStoredProc;
Viele Grüsse Frank |
Re: dankschön
Zitat:
Bei 10000 Datensätzen warte ich für das Darstellen der Tabelle bis zu 10 Sekunden. In der DB selber geht es ratz fatz. thx Alexander |
Re: ADO Stored Procedure
hay!
ich verwende seit neustem die BETTERADODATASET Komponente. hab diesen Tip im Internet gesehen und muss sagen ist um einiges schneller und auch weniger fehlerhaft. ![]() gruss |
Re: dankschön
Zitat:
Genau, die dbGO Komponenten sind die in Delphi enthaltenen ADO-Komponenten. Wenn Du mit der Geschwindigkeit nicht zufrieden bist, dann besorg Dir am besten mal das Buch "Delphi und ADO" von Andreas Kosch. Da steht, wie man ADO direkt programmiert und das rockt dann von der Geschwindigkeit her... Du schreibst, dass die 10000 Datensätze in der Datenbank schnell angezeigt werden. Das kann verschiedene Gründe haben (unter anderem den, dass nicht alle Datensätze geladen werden sondern nur die die angezeigt werden (bzw. etwas mehr) und dass wenn der Anwender durch die Daten scrollt weitere Daten im Hintergrund nachgeladen werden. Aber mit direkter ADO Programmierung geht das trotzdem fixer als mit dbGO. Viele Grüsse Frank |
Re: ADO Stored Procedure
Hi,
also diese Frage ist zwar schon ein bißchen her, aber ich will trotzdem ein bißchen mehr schreiben: Also meine Parameterübergabe an die Stored Procedure formuliere ich immer wie folgt: datenadressesuchen.SPADRESSESUCHEN.Parameters.Item s[1].Value:=zentralestart.Edit1.Text+'%'; Meine Stored Procedure sieht dabei wie folgt aus: CREATE PROCEDURE adresse_suchen @parameter nvarchar(100) = null AS /*################################################# ######################### # WENN KEINE EINGABE GEMACHT WURDE FOLGENDE FEHLERMELDUNG AUSGEBEN ################################################## ########################*/ IF @parameter = '' BEGIN RAISERROR ('Bitte geben Sie den Namen, die Firma oder den Ort ein', 16, 1, 'Hinweis') END /*################################################# ######################## # WENN EINGABE GEMACHT WURDE FOLGENDES SQL-STATEMENT AUSFÜHREN ################################################## #######################*/ IF @parameter <> '' BEGIN select firma as FIRMENNAME, name as NACHNAME, vorname as VORNAME, plz AS PLZ, ort AS ORT from contact_kontakt where name like @parameter or firma like @parameter or ort like @parameter order by firma,name,ort END GO Ich würde niemals die Parameterübergabe an eine Stored Procedure wie folgt schreiben: adostoredproc1.parameters.parambyname('parameterna me').value:=blabla Der Grund ist der, das erstens Rechtsschreibfehler irgendwann nerven und zweitens Du für die Namen die Datenbank nutzen solltest und Dir nicht in der Programmierung einen Kopf über irgendwelche Bezeichnungen machen solltest. Ich hoffe es funzt jetzt. Eines noch: Diese ADO-Diskussion ob ADO schnell oder nicht schnell sollte man mal relativieren. Wieviel Datensätze werden denn gezogen über den ADO ? Wenn ich in einer Client-Server-Verbindung 1 Mio Datensätze hole, dann ist jede Verbindung lahm. Ich benutze schon seit ewigen Tagen ADO und zu 99% Stored Procedures in der Datenbank und hatte noch nie Probleme damit. Ich bin der Meinung das nicht ADO lahm ist sondern das Grid, in dem die Datensätze angezeigt werden. (Die obige Stored Procedure benötigt für 15000 Datensätze unter 1 s, und das obwohl haufenweise like-Abfragen drin sind) Okay, bis denne denn Steffen [edit=Gérome]Zu lange Zeilen gekürzt. Mfg, Gérome[/edit] |
Re: ADO Stored Procedure
Hallo Steffen!
Zitat:
Viele Grüsse Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz