Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi StoredProcedure mit ADO und MS SQL Server 2000 (https://www.delphipraxis.net/48796-storedprocedure-mit-ado-und-ms-sql-server-2000-a.html)

cds 30. Jun 2005 13:53

Datenbank: MS SQL • Version: 2000 • Zugriff über: ADO

StoredProcedure mit ADO und MS SQL Server 2000
 
Hallo DPler,

ich versuche aus meiner Anwendung heraus eine StoredProcedure auf dem MS SQL Server 2000 auszuführen.
Dabei habe ich einige Probleme.

1. Die StoredProcedure aus dem Server sieht so aus:
SQL-Code:
CREATE PROCEDURE [dbo].[spGetCrntEvalsForTeststand_2]

   @TeststandIndex int

 AS
SELECT    dbo.TESTSTAND.TSTName, dbo.EVALUATION.CrntEVAL
FROM        dbo.EVALUATION INNER JOIN
                      dbo.TESTTYPE ON dbo.EVALUATION.CrntTYPE = dbo.TESTTYPE.CrntTYPE INNER JOIN
                      dbo.TESTSTAND ON dbo.TESTTYPE.CrntTST = dbo.TESTSTAND.CrntTST
WHERE (dbo.TESTSTAND.CrntTST = @TeststandIndex)
GO
2. Mein Zugriff aus Delphi heraus:
Delphi-Quellcode:
try
  self.FADOStoredProc.ProcedureName := 'spGetCrntEvalsForTeststand_2';
  self.FADOStoredProc.Parameters.ParamByName('@TeststandIndex').Value := 1;
  self.FADOStoredProc.Connection := self.ADOConnection;
  self.FADOStoredProc.Open;
  dataSP := self.FADOStoredProc.Recordset;
  if dataSP.RecordCount = self.FADOStoredProc.RecordCount then beep;
except
  exit;
end;//end try..except
Mein Problem tritt auf, wenn ich meiner ADOStoredProc den Parameter übergeben will!
Dann läuft die Anwendung in eine exception.

Anmerkung: Aus C# heraus habe ich mit dieser SP absolut keine Probleme!

Hat jemand eine Idee oder Lösung parat?

[edit=alcaeus]sql- und delphi-Tags eingefuegt. In Zukunft bitte selbst machen, Danke Mfg, alcaeus[/edit]

shmia 30. Jun 2005 13:58

Re: StoredProcedure mit ADO und MS SQL Server 2000
 
Zitat:

Zitat von cds
2. Mein Zugriff aus Delphi heraus:
Delphi-Quellcode:
try
  self.FADOStoredProc.ProcedureName := 'spGetCrntEvalsForTeststand_2';
  self.FADOStoredProc.Parameters.ParamByName('@TeststandIndex').Value := 1;
  self.FADOStoredProc.Connection := self.ADOConnection;
  self.FADOStoredProc.Open;
  dataSP := self.FADOStoredProc.Recordset;
  if dataSP.RecordCount = self.FADOStoredProc.RecordCount then beep;
except
  exit;
end;//end try..except
Mein Problem tritt auf, wenn ich meiner ADOStoredProc den Parameter übergeben will!
Dann läuft die Anwendung in eine exception.

Du musst dem ADOStoredProc Objekt immer zuerst die Connection geben,
danach den Procedurename angeben und dann die Parameter "refreshen".
Delphi-Quellcode:
  Assert(Assigned(FADOStoredProc));
  FADOStoredProc.Connection := self.ADOConnection;
  FADOStoredProc.ProcedureName := 'spGetCrntEvalsForTeststand_2';
  FADOStoredProc.Parameters.Refresh; // <---
  FADOStoredProc.Parameters.ParamByName('@TeststandIndex').Value := 1;
[edit=alcaeus]Delphi-Tags im Zitat eingefuegt. Mfg, alcaeus[/edit]

cds 30. Jun 2005 14:01

Re: StoredProcedure mit ADO und MS SQL Server 2000
 
Danke für die schnelle Antwort shmia!

Kaum richtig gemacht - und schon funktioniert's....

Das rettet mir den Nachmittag!

cds...

testoli 1. Jul 2005 15:43

Re: StoredProcedure mit ADO und MS SQL Server 2000
 
Hallo,

ich habe Eurer Beispiel bei mir ausprobiert.

SP:
SQL-Code:
CREATE PROCEDURE [INS_ADR_TYP]
   (
    @ADRT_WERT_2    [varchar](30)               
   )

AS
SET NOCOUNT ON
INSERT INTO [CS_SHOP].[dbo].[cs_Adresstyp]
    (
    [ADRT_WERT],
    [CREATED],
    [MODIFIED],
    [AKTIONUSER])
 
VALUES
   ( 
    @ADRT_WERT_2,
    getdate(),
    getdate(),
   user)
SET NOCOUNT OFF
GO
Nun habe ich einen Button_Click Event:

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
begin
try
DM.DM_Main.SP_NEW_ADRTYP.Parameters.Refresh;
DM.DM_Main.SP_NEW_ADRTYP.Parameters.ParamByName('@ADRT_WERT_2').Value := TB_Wert.Text;
DM.DM_Main.SP_NEW_ADRTYP.Open;

except
exit;

end;
Wenn ich den Befehl sende, erhalte ich folgenden Fehler:

"Commandtext gibt keine Ergebnissmenge zurück!"

Was habe ich nicht beachtet???

LG
Oliver

[edit=alcaeus]code-Tags gesetzt. In Zukunft bitte selbst machen. Danke :) Mfg, alcaeus[/edit]

shmia 1. Jul 2005 15:53

Re: StoredProcedure mit ADO und MS SQL Server 2000
 
Zitat:

Zitat von testoli
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
begin
try
DM.DM_Main.SP_NEW_ADRTYP.Parameters.Refresh;
DM.DM_Main.SP_NEW_ADRTYP.Parameters.ParamByName('@ADRT_WERT_2').Value := TB_Wert.Text;
DM.DM_Main.SP_NEW_ADRTYP.Open;

except
exit;

end;
Wenn ich den Befehl sende, erhalte ich folgenden Fehler:
"Commandtext gibt keine Ergebnissmenge zurück!"
Was habe ich nicht beachtet???

Nur Abfragen mit SELECT geben eine Ergebnismenge zurück. Diese werden mit .Open geöffnet.
Alles andere (INSERT, UPDATE, DELETE, ALTER ...) gibt keine Ergebnismenge zurück und wird mit
.ExecSQL ausgeführt.
Übrigens, folgendes sollte man nicht tun:
Delphi-Quellcode:
try
    // Zugriff auf Datenbank
    DM.DM_Main.SP_NEW_ADRTYP.ExecSQL;
except
   exit;
end;
Der Datenbankzugriff funktioniert nicht, keine Fehlermeldung erscheint (nur in der IDE) und keiner weiss warum die Sache nicht funktioniert.
Dann lieber try ... except komplett weglassen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:19 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