Announcement

Collapse
No announcement yet.

Stored Procedure und ADO/BetterADO

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Stored Procedure und ADO/BetterADO

    Hallo,

    Irgendwie geht mit das nicht ein warum ich einer OUTPUT variablen umbedingt einen Wert geben muß bevor ich die Procedure aufrufe.
    Und wie das ganze mittels BetterADODS funkt kapier ich überhaupt nicht.

    Ich hab eine Procedure auf einen MS SQL Server 7.0 die so anfängt
    CREATE PROCEDURE spPASPreise
    @Mandant smallint,
    @Liste integer,
    @Artikel varchar(20),
    @Menge money,
    @preis money OUTPUT
    AS
    begin

    ...
    Bitte könnt Ihr mir erklären wie ich die BetterADO Komponente verwende um diese Proc richtig zu beschicken und dann in @preis das Ergebnis zu bekommen.

    DANKE
    LG Peter

  • #2
    Hallo,

    die <b>TADOCommand</b>-Komponente (alias das native Command-Objekt von ADO) kommt immer dann zum Einsatz, wenn die aufgerufene Stored Procedure <b>keine</b> Ergebnismenge zurückliefert und wenn <b>Output</b>-Parameter und Rückgabewerte ausgewertet werden sollen. Das folgende Beispiel verdeutlicht den Einsatz:

    A) Vorbereitung in der Datenbank tempdb des MS SQL Server
    <pre>
    USE tempdb
    GO

    CREATE TABLE plzDAT (
    Ortsname VARCHAR (20) NOT NULL PRIMARY KEY,
    Postleitzahl CHAR(5) NOT NULL)
    GO
    INSERT INTO plzDAT (Ortsname, Postleitzahl) VALUES ('A-Stadt', '12345')
    INSERT INTO plzDAT (Ortsname, Postleitzahl) VALUES ('B-Dorf', '54321')
    GO

    CREATE PROCEDURE stprOrtsname
    @sPLZ char(5),
    @sORT varchar(20) output
    AS
    SELECT @sORT = Ortsname
    FROM plzDat
    WHERE Postleitzahl = @sPLZ
    -- Trefferanzahl zurueckliefern
    RETURN @@rowcount
    GO

    -- Stored Procedure testen

    DECLARE @sParam CHAR(5)
    DECLARE @Out VARCHAR(20)
    DECLARE @sResult INTEGER
    SELECT @sParam = '54321'
    EXEC @sResult = stprOrtsname @sParam, @Out OUTPUT
    PRINT @sResult
    PRINT @Out
    </pre>

    B) Konfiguration im Objektinspektor
    <pre>
    object Form1: TForm1
    Left = 192
    Top = 114
    Width = 870
    Height = 640
    Caption = 'Form1'
    Color = clBtnFace
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -11
    Font.Name = 'MS Sans Serif'
    Font.Style = []
    OldCreateOrder = False
    PixelsPerInch = 96
    TextHeight = 13
    object EditPLZ: TEdit
    Left = 128
    Top = 24
    Width = 81
    Height = 21
    TabOrder = 0
    Text = '54321'
    end
    object Button1: TButton
    Left = 216
    Top = 24
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 1
    OnClick = Button1Click
    end
    object ADOConnection1: TADOConnection
    Connected = True
    ConnectionString =
    'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security In' +
    'fo=False;Initial Catalog=tempdb;Data Source=.'
    LoginPrompt = False
    Provider = 'SQLOLEDB.1'
    Left = 40
    Top = 24
    end
    object ADOCommand1: TADOCommand
    CommandText = 'stprOrtsname;1'
    CommandType = cmdStoredProc
    Connection = ADOConnection1
    Parameters = <
    item
    Name = '@RETURN_VALUE'
    DataType = ftInteger
    Direction = pdReturnValue
    Precision = 10
    end
    item
    Name = '@sPLZ'
    Attributes = [paNullable]
    DataType = ftString
    Size = 5
    end
    item
    Name = '@sORT'
    Attributes = [paNullable]
    DataType = ftString
    Direction = pdInputOutput
    Size = 20
    end>
    Left = 80
    Top = 24
    end
    end
    </pre>

    C) Aufruf im Programm
    <pre>
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, DB, ADODB;

    type
    TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    EditPLZ: TEdit;
    Button1: TButton;
    ADOCommand1: TADOCommand;
    procedure Button1Click(Sender: TObject);
    private
    { Private-Deklarationen }
    public
    { Public-Deklarationen }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    var
    iResult : Integer;
    sOrt : WideString;
    begin
    ADOCommand1.Parameters[1].Value := EditPLZ.Text;
    ADOCommand1.Execute;
    iResult := ADOCommand1.Parameters[0].Value;
    sOrt := VarToStr(ADOCommand1.Parameters[2].Value);
    ShowMessage(sOrt);
    ShowMessage(IntToStr(iResult));
    end;

    end.
    </pre>

    Im Gegensatz zu TADOCommand möchte sowohl TADODataSet als auch TADOBetterADODataSet von der Stored Procedure eine Ergebnismenge haben - im Fall der OUTPUT-Parameter kommt jedoch keine

    Comment


    • #3
      Hallo,

      Ich Dussel hab natürlich vergessen zu erwähnen das ich es auch mit ADOStoredProc versucht habe. Und dabei bekomme ich imm die Fehlermeldung
      Meldung: Prozedur 'spPASPreise' erwartet Parameter '@Preis'; dieser wurde nicht übergeben.

      AUch mit ADOCommand bekomme ich diese Meldung. Und das obwohl meine Programmzeilen wie folgt lauten:

      Preisfindung.Parameters.ParamByName('@Mandant').va lue := Mandant;<br>
      Preisfindung.Parameters.ParamByName('@Artikel').va lue := artikelnummer;<br>
      Preisfindung.Parameters.ParamByName('@Menge').valu e := Menge;<br>
      Preisfindung.Parameters.ParamByName('@Preis').Valu e := 1;<br>
      Preisfindung.Parameters.ParamByName('@Liste').valu e := Q_Kontokorrent.fieldByName('Preisliste').asinteger ;<br>
      Q_Kontokorrent.close;<br>
      Preisfindung.Execute;<br>

      LG
      Pete

      Comment


      • #4
        Hallo,

        Hat sich erledigt.
        Ich hab nicht aufgepasst bei der Rekursion meiner Stored Procedure.
        Jetzt funktioniert es.

        Danke
        Pete

        Comment

        Working...
        X