AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Auto-Insertwert abfragen

Auto-Insertwert abfragen

Ein Thema von emsländer · begonnen am 1. Okt 2008 · letzter Beitrag vom 2. Okt 2008
Antwort Antwort
Seite 1 von 3  1 23   
Benutzerbild von emsländer
emsländer

Registriert seit: 21. Aug 2004
Ort: Lengerich
658 Beiträge
 
RAD-Studio 2009 Ent
 
#1

Auto-Insertwert abfragen

  Alt 1. Okt 2008, 13:03
Datenbank: MSSQL • Version: 2005 • Zugriff über: ADO
Moin,

wie kann ich in diesem Konstrukt den Autoinc-Wert abfragen?

Delphi-Quellcode:
  _stmp := 'select * from Akten';
  _query := Tadoquery.Create(nil);
  with _query do begin
    connection := mus_Service.ADOConnMUS;
    try
      _query.sql.Text := _stmp;
      _query.open;
      insert;
      FieldValues['Datum_und_Zeit'] := Datum_und_Zeit;
      FieldValues['SenderIP'] := SenderIP;
      FieldValues['eMail'] := eMail;
      FieldValues['Telefon'] := Telefon;
      FieldValues['Mobile'] := Mobile;
      FieldValues['Art'] := Art;
      post;
      result := xxx; // Hier die Abfrage
    finally
      freeandnil(_query);
      result := 0;
    end;
  end;
Die Table hat ein Feld mit dem Namen Aktenr, welches AUTOINC ist.

Gruss

EL


Narben am Körper sind ein Zeichen dafür, das man gelebt hat.
Narben auf der Seele sind ein Zeichen dafür, das man geliebt hat.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#2

Re: Auto-Insertwert abfragen

  Alt 1. Okt 2008, 13:16
Ich habe mal ein bisschen gegockelt und das Einzige, was ich finden konnte ist, sofort nach dem Insert die Identity abzufragen. Beispiel in PHP (von hier):
Code:
$result = mssql_query("INSERT INTO STUFF(gaga,otherGaga) VALUES ('hello','apple'); SELECT @@IDENTITY as insertId;");
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von emsländer
emsländer

Registriert seit: 21. Aug 2004
Ort: Lengerich
658 Beiträge
 
RAD-Studio 2009 Ent
 
#3

Re: Auto-Insertwert abfragen

  Alt 1. Okt 2008, 13:21
Zitat von DeddyH:
Ich habe mal ein bisschen gegockelt und das Einzige, was ich finden konnte ist, sofort nach dem Insert die Identity abzufragen. Beispiel in PHP (von hier):
Code:
$result = mssql_query("INSERT INTO STUFF(gaga,otherGaga) VALUES ('hello','apple'); SELECT @@IDENTITY as insertId;");
Das ist mir bekannt. Ich muss in diesem Fall aber mit diesem ADO-Konstrukt arbeiten.

Gruss

EL


Narben am Körper sind ein Zeichen dafür, das man gelebt hat.
Narben auf der Seele sind ein Zeichen dafür, das man geliebt hat.
  Mit Zitat antworten Zitat
MorphieX

Registriert seit: 6. Jan 2007
10 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Auto-Insertwert abfragen

  Alt 1. Okt 2008, 13:58
Nur ne idee, kenn mich mit MSSQL nicht aus, aber:
steht sowas nicht in ner System-tabelle?
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#5

Re: Auto-Insertwert abfragen

  Alt 1. Okt 2008, 14:02
Hallo,

mir ist da nur eine Möglichkeit bekannt, ein Select auf genau den Datensatz, den Du soeben eingefügt hast.

Ins Unreine ungefähr so:
SQL-Code:
select AutoIncSpalte from Akten
where Datum_und_Zeit = :Datum_und_Zeit
and SenderIP = :SenderIP
and eMail = :eMail
and Telefon = :Telefon
and Mobile = :Mobile
and Art = :Art
Sofern Du "alleine" auf der Datenbank unterwegs bist, also keiner parallel oder fast parallel Daten einfügen kann, dann könntest Du dank AutoInc auch mit
select max(AutoInc_Spalte) from Akten zum Ziel kommen. Fügen mehrere Personen, Programm... Daten ein, so scheitert das, da nicht sichergestellt ist, dass Dein Satz der Neueste ist und damit über diesen Wert verfügt.

Stephan
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Auto-Insertwert abfragen

  Alt 1. Okt 2008, 14:09
Einfach nach dem Post den Wert in einer getrennten Abfrage auslesen.
select Scope_Identity() (Scope_Identity() ist besser geeignet weil @@identity den wirklich letzten Auto Wert der aktuellen Session zurückgibt. Führt ein Insert in eine Tabelle einen InsertTrigger aus, der selbst wieder in eine andere Tabelle mit Autoinc Wert was einfügt, so gibt dir @@identity diesen letzten Wert zurück.

Angst um parallelen Zugriff muss man übrigens nicht haben, weil dieses Ganze Identity Auslesen Session bezogen ist, sich also auf eine Connection bezieht.

Persönlich allerdings bevorzuge ich das Reservieren eines eindeutigen Werte bereits vor dem Insert (In anderen Datenbank als Sequenzen bekannt). Hier muss man allerdings darauch achten, dass die Ganze Spielerei transaktionssicher ist (sobald es mehr als eine SQL Anweisung ist kann es passieren, dass eine andere Session dazwischenfunkt).

Hier z.B. mal der Code zum Nachahmen von Sequenzen unter MSSQL. Dazu noch eine geeignete Delphi Klasse zum Kapseln, und schon erhält man ganz easy bereits vorm Insert einen eindeutigen ID Wert auch ohne diese Identity Gedöhns (was einem z.B. bei .NET tierisch auf den Sack geht weil connectionslos gearbeitet wird).

SQL-Code:
CREATE TABLE [dbo].[Sequence] (
   [SequenceName] [varchar] (255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
   [CurrentValue] [bigint] NOT NULL ,
   [Increment] [int] NOT NULL ,
   [CreationDate] [datetime] NOT NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Sequence] WITH NOCHECK ADD
   CONSTRAINT [PK_Sequence] PRIMARY KEY CLUSTERED
   (
      [SequenceName]
   ) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Sequence] ADD
   CONSTRAINT [DF_Sequence_CurrentValue] DEFAULT (0) FOR [CurrentValue],
   CONSTRAINT [DF_Sequence_Increment] DEFAULT (1) FOR [Increment],
   CONSTRAINT [DF_Sequence_CreationDate] DEFAULT (getdate()) FOR [CreationDate],
   CONSTRAINT [CK_Sequence] CHECK ([Increment] <> 0)
GO




SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO




CREATE PROCEDURE spNextSequence (@SequenceName varchar(255), @SequenceId bigint OUTPUT) AS
DECLARE @Increment int


SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION SP_GEN_ID


SET @SequenceId = (Select CurrentValue from Sequence where SequenceName = @SequenceName)

IF @SequenceId is null BEGIN
    insert into Sequence (SequenceName) values (@SequenceName)
   SET @SequenceId = (Select CurrentValue from Sequence where SequenceName = @SequenceName)
END
  

SET @Increment = (Select Increment from Sequence where SequenceName = @SequenceName)
update Sequence set CurrentValue=CurrentValue+@Increment where SequenceName = @SequenceName
SET @SequenceId = (Select CurrentValue from Sequence where SequenceName = @SequenceName)


COMMIT TRANSACTION SP_GEN_ID

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
Man beachte hier in der Stored Procedure das
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE Damit wird sichergestellt, dass immer nur einer diese Prozedur gleichzeitig ausführen kann.
  Mit Zitat antworten Zitat
Benutzerbild von emsländer
emsländer

Registriert seit: 21. Aug 2004
Ort: Lengerich
658 Beiträge
 
RAD-Studio 2009 Ent
 
#7

Re: Auto-Insertwert abfragen

  Alt 1. Okt 2008, 14:15
Zitat von Jelly:
Einfach nach dem Post den Wert in einer getrennten Abfrage auslesen.
select Scope_Identity() (Scope_Identity() ist besser geeignet weil @@identity den wirklich letzten Auto Wert der aktuellen Session zurückgibt. Führt ein Insert in eine Tabelle einen InsertTrigger aus, der selbst wieder in eine andere Tabelle mit Autoinc Wert was einfügt, so gibt dir @@identity diesen letzten Wert zurück.

Angst um parallelen Zugriff muss man übrigens nicht haben, weil dieses Ganze Identity Auslesen Session bezogen ist, sich also auf eine Connection bezieht.

Blöde Frage: Wie baue ich diesen: select Scope_Identity() in dieses Konstrukt ein?

Delphi-Quellcode:
  with _query do begin
    connection := mus_Service.ADOConnMUS;
    try
      sql.Text := _stmp;
      open;
      insert;
      FieldValues['Datum_und_Zeit'] := Datum_und_Zeit;
      FieldValues['SenderIP'] := SenderIP;
      FieldValues['eMail'] := eMail;
      FieldValues['Telefon'] := Telefon;
      FieldValues['Mobile'] := Mobile;
      FieldValues['Art'] := Art;

      post;
      result := ????? <======== HIER
      _query.Close;
    finally
      freeandnil(_query);
      result := 0;
    end;
  end;


Gruss

EL


Narben am Körper sind ein Zeichen dafür, das man gelebt hat.
Narben auf der Seele sind ein Zeichen dafür, das man geliebt hat.
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Auto-Insertwert abfragen

  Alt 1. Okt 2008, 14:24
Delphi-Quellcode:
with _query do begin
    connection := mus_Service.ADOConnMUS;
    try
        sql.Text := _stmp;
        open;
        insert;
        FieldValues['Datum_und_Zeit'] := Datum_und_Zeit;
        FieldValues['SenderIP'] := SenderIP;
        FieldValues['eMail'] := eMail;
        FieldValues['Telefon'] := Telefon;
        FieldValues['Mobile'] := Mobile;
        FieldValues['Art'] := Art;

        post;
        result := LastIdentity;
        _query.Close;
    finally
        freeandnil(_query);
        //result := 0; --> Sonst wird dir nach aussen immer 0 ausgegeben
    end;
end;

function LastIdentity : integer;
begin
    with _query do begin
        connection := mus_Service.ADOConnMUS;
        try
           sql.Text := 'Select Scope_Identity() as id';
           open;
           if not(FielByName('id').IsNull) then
              result := FieldByName('id').asInteger;
           else
              result := 0;
           _query.Close;
           exit;
        finally
           freeandnil(_query);
       end;
    end;
end ;
  Mit Zitat antworten Zitat
Benutzerbild von emsländer
emsländer

Registriert seit: 21. Aug 2004
Ort: Lengerich
658 Beiträge
 
RAD-Studio 2009 Ent
 
#9

Re: Auto-Insertwert abfragen

  Alt 1. Okt 2008, 14:45
Zitat von Jelly:
Delphi-Quellcode:
with _query do begin
    connection := mus_Service.ADOConnMUS;
    try
        sql.Text := _stmp;
        open;
        insert;
        FieldValues['Datum_und_Zeit'] := Datum_und_Zeit;
        FieldValues['SenderIP'] := SenderIP;
        FieldValues['eMail'] := eMail;
        FieldValues['Telefon'] := Telefon;
        FieldValues['Mobile'] := Mobile;
        FieldValues['Art'] := Art;

        post;
        result := LastIdentity;
        _query.Close;
    finally
        freeandnil(_query);
        //result := 0; --> Sonst wird dir nach aussen immer 0 ausgegeben
    end;
end;

function LastIdentity : integer;
begin
    with _query do begin
        connection := mus_Service.ADOConnMUS;
        try
           sql.Text := 'Select Scope_Identity() as id';
           open;
           if not(FielByName('id').IsNull) then
              result := FieldByName('id').asInteger;
           else
              result := 0;
           _query.Close;
           exit;
        finally
           freeandnil(_query);
       end;
    end;
end ;
Hi Jelly,

der liefert mir immer 0 als result

Gruss

EL


Narben am Körper sind ein Zeichen dafür, das man gelebt hat.
Narben auf der Seele sind ein Zeichen dafür, das man geliebt hat.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#10

Re: Auto-Insertwert abfragen

  Alt 1. Okt 2008, 14:50
Und wenn Du in der Funktion eine eigene lokale Query erzeugst?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 16:43 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