Announcement

Collapse
No announcement yet.

Inserts mit ADO

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

  • Inserts mit ADO

    Hallo...

    ich versuch gerade mit einer TAdoQuery einen datensatz in eine tabelle einzufügen. beim execsql bekomme ich aber die fehlermeldung "optionales feature nicht implementiert". hat jemand einen tip? oder welchen weg soll ich gehen, um einen datensatz einzufügen?

    danke

    volkmar
    <pre>
    procedure InsertVorgang(qaUpdate: TADOquery; Vorgang, Bezeichnung, NotizText, Kopf_ID: String);
    begin
    qaUpdate.sql.Text :=
    'Insert into A_Vorgang (ID_A_Kopf, Nummer, Bezeichnung, Datum, Zeit, Benutzer, NotizCode, NotizText) ' +
    'Values (:ID_A_Kopf, :Nummer, :Bezeichnung, atum, :Zeit, :Benutzer, :NotizCode, :NotizText)';
    qaUpdate.Prepared := true;
    qaUpdate.parameters.ParamByName('ID_A_Kopf').Value := Kopf_ID;
    qaUpdate.parameters.ParamByName('Nummer').Value := Vorgang;
    qaUpdate.parameters.ParamByName('Bezeichnung').Val ue := Bezeichnung;
    qaUpdate.parameters.ParamByName('Datum').Value := Date;
    qaUpdate.parameters.ParamByName('Zeit').Value := Time;
    qaUpdate.parameters.ParamByName('Benutzer').Value := '(kein)';
    qaUpdate.parameters.ParamByName('NotizCode').Value := '(kein)';
    qaUpdate.parameters.ParamByName('NotizText').Value := NotizText;
    qaUpdate.execsql;
    qaUpdate.Prepared := False;
    end;
    </pre>

  • #2
    Hallo,

    in einem neuen Projekt sollte man <b>nicht</b> auf die "alten" Kompatibilitäts-Komponenten TADOQuery und TADOTable zurückgreifen. Der Sinn dieser Dinger besteht nur darin, die Migration von einem alten BDE-Projekt auf ADO im ersten Schritt zu erleichtern. In einem neuen Projekt ist <b>TADODataSet</b> die erste Wahl, wenn es nichts Besseres gibt. Und beim Einfügen von neuen Datensätzen über eine parametisierte INSERT-Anweisung gibt es mit <b>TADOCommand</b> eine bessere Alternative. Das könnte so aussehen:

    <pre>
    procedure TForm1.TestADO_TADOCommand;
    var
    i : Integer;
    s : String;
    c : Currency;
    begin
    ADOConnection1.Connected := True;
    ADOCommand1.Prepared := True;
    if CheckBoxTrans.Checked then
    ADOConnection1.BeginTrans;
    for i := 1 to cLOOP_COUNT do
    begin
    s := IntToStr(i);
    c := 2.12 * i;
    ADOCommand1.Parameters[1].Value := s + ' Testeintrag' + s;
    ADOCommand1.Parameters[2].Value := s + ' XYZ';
    ADOCommand1.Parameters[3].Value := Now;
    ADOCommand1.Parameters[4].Value := c;
    ADOCommand1.Execute;
    end;
    if CheckBoxTrans.Checked then
    ADOConnection1.CommitTrans;
    ADOConnection1.Connected := False;
    end;
    </pre>
    Bevor man <b>Prepared</b> verwendet, sollte man vorher die Dokumentation des verwendeten OLE DB-Providers zu Rate ziehen. Bei "guten" Providern ist das vorherige Vorbereitung der Anweisung über Prepare nicht notwendig und im Fall des MS SQL Server 7/2000 sogar kontraproduktiv (wie ein kurzer Blick in den <i>Profiler</i> zeigt)

    Comment


    • #3
      hallo herr kosch...

      ich schaffe es nicht ums verrecken, ein datum einzufügen... ich hab jetzt auch mal versucht, im where eines selects ein datum als parameter zu übergeben und bekomme den gleichen fehler... die einzige möglichkeit, die ich gefunden habe, ist das datum im format mm.dd.yyyy fix ins sql einzubauen. das ist zwar extrem unschön, aber was solls.<P>

      haben sie eine idee, was ich falsch mache, denn ich hasse es, wenn ich unerklärliche dinge ungelößt lassen muss

      Comment


      • #4
        Hallo,

        welche Datenbank und welcher OLE DB-Provider wird verwendet? In meinem Beispiel vom 15.8. wird als 3. Parameter <i>Now</i> für das aktuelle Datum übergeben - also funktioniert das auch mit einem Datum

        Comment


        • #5
          ich verwende:<br>
          sql-server 7<BR>
          provider MSDASQL<BR>
          ConnectionString:"Anfrage=uid=sa;pwd=;server=NTSER VER1;driver=SQL Server;database=Anfrage-Look;DSN=;&quot

          Comment


          • #6
            Hallo,

            warum wird die alte ODBC-Anbindung für den Zugriff auf den SQL Server 7 verwendet? Microsoft hat einige Warnungen in seiner Knowlegde Base, die die unerwünschten Nebenwirkungen dieses "alten" Wegs betreffen. Eine Anwendung sollte heute den <i>Microsoft OLE DB Provider for SQL Server</i> (<b>SQLOLEDB</b>) verwenden.

            Das folgende Beispiel demonstriert den "richtigen" Weg. Die Tabelle <i>Volkmar</i> wird in der <b>tempdb</b> auf dem lokal installierten SQL Server angelegt:
            <pre>
            CREATE TABLE Volkmar(
            Volkmar_ID INT NOT NULL IDENTITY PRIMARY KEY,
            DatumZeit DATETIME,
            Eintrag VARCHAR(10))
            </pre>
            Konfiguration im Objektinspektor:
            <pre>
            object Form1: TForm1
            Left = 315
            Top = 122
            Width = 696
            Height = 480
            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 Button1: TButton
            Left = 104
            Top = 16
            Width = 75
            Height = 25
            Caption = 'Button1'
            TabOrder = 0
            OnClick = Button1Click
            end
            object ADOConnection1: TADOConnection
            Connected = True
            ConnectionString =
            'Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initi' +
            'al Catalog=tempdb;Data Source=(local)'
            LoginPrompt = False
            Provider = 'SQLOLEDB.1'
            Left = 16
            Top = 16
            end
            object ADOCommand1: TADOCommand
            CommandText =
            'INSERT INTO Volkmar (DatumZeit, Eintrag) '#13#10'VALUES (atumZeit, :' +
            'Eintrag)'#13#10
            Connection = ADOConnection1
            ExecuteOptions = [eoExecuteNoRecords]
            Parameters = <
            item
            Name = 'DatumZeit'
            Attributes = [paNullable]
            DataType = ftDateTime
            NumericScale = 3
            Precision = 23
            Size = 16
            Value = Null
            end
            item
            Name = 'Eintrag'
            Attributes = [paNullable]
            DataType = ftString
            NumericScale = 255
            Precision = 255
            Size = 10
            Value = Null
            end>
            Left = 56
            Top = 16
            end
            end
            </pre>
            Aufruf im Programm:
            <pre>
            unit Unit1;

            interface

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

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

            var
            Form1: TForm1;

            implementation

            {$R *.dfm}

            procedure TForm1.Button1Click(Sender: TObject);
            begin
            ADOCommand1.Parameters[0].Value := Now;
            ADOCommand1.Parameters[1].Value := 'Test';
            ADOCommand1.Execute;
            end;

            end.
            </pre&gt

            Comment


            • #7
              halleluia und amen...<p>
              jetzt funktioniert's... ich bin noch neu bei ado und hab mal das eingestellt gelassen, was delphi mir eingestellt hat. jetzt bau ich mir den connection string nach ihrem muster zusammen...<p>
              danke für die hilf

              Comment

              Working...
              X