Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Mehr Benutzer Primary Key Insert in Tabelle (https://www.delphipraxis.net/40406-mehr-benutzer-primary-key-insert-tabelle.html)

Elvis 29. Okt 2007 10:28

Re: Mehr Benutzer Primary Key Insert in Tabelle
 
Du kannst mit Hilfe von Rdb$Database Pseudo-Selects ausführen.
Also Selects, die immer eine Zeile liefern:
SQL-Code:
SELECT Gen_ID(DeinGenerator, 1)
FROM  Rdb$Database

mkinzler 29. Okt 2007 11:17

Re: Mehr Benutzer Primary Key Insert in Tabelle
 
Zitat:

Zitat von Elvis
Du kannst mit Hilfe von Rdb$Database Pseudo-Selects ausführen.
Also Selects, die immer eine Zeile liefern:
SQL-Code:
SELECT Gen_ID(DeinGenerator, 1)
FROM  Rdb$Database

Sieht aber sehr nach Firebird aus, er verwendet aber MSSQL.

alzaimar 29. Okt 2007 11:34

Re: Mehr Benutzer Primary Key Insert in Tabelle
 
Wir verwenden auch Generatoren in MSSQL, also die von shmia propagierte Lösung. Wichtig ist nur der Transaktionslevel, der garantiert, das wirklich nie zwei Prozesse den gleichen Wert bekommen...

Brainshock 29. Okt 2007 12:20

Re: Mehr Benutzer Primary Key Insert in Tabelle
 
Wie gesagt, ich kann kein
SQL-Code:
exec generator_id 'meinetabelle'
benutzen, da hier das Ergebnis im Parameter zurückkommt und der mit mStoredProcedure nicht gefüllt wird.

Gruß

mkinzler 29. Okt 2007 12:29

Re: Mehr Benutzer Primary Key Insert in Tabelle
 
Dann mach doch einen select auf die SP

alzaimar 29. Okt 2007 12:39

Re: Mehr Benutzer Primary Key Insert in Tabelle
 
Versuch doch mal so ein script:
SQL-Code:
Declare @r int
exec MyProcedure @r output
select @r as Ergebnis

Brainshock 29. Okt 2007 13:53

Re: Mehr Benutzer Primary Key Insert in Tabelle
 
@alzaimar: Wie soll ich das Skript ausführen, über eine Query?

@mkinzler: Ein Select auf die SP haut nicht hin bzw. ich weiß nicht genau wie dieses aussehen muß. Hab folgendes probiert:
SQL-Code:
select * from generator_id('meinetabelle')
Ergebnis: Ungültiger Objektname 'generator_id'.

SQL-Code:
select * from generator_id 'meinetabelle'
Ergebnis: Falsche Syntax in der Nähe von 'meinetabelle'

Gruß

alzaimar 29. Okt 2007 14:05

Re: Mehr Benutzer Primary Key Insert in Tabelle
 
Yup über eine TQuery oder ein TDataset. Die BDE unterstützt leider keine Skripte, aber ADO...

Ich würde vielleicht auch einfach die StoredProcedure so umschreiben, das sie genau eine Tabelle liefert (eine Zeile, eine Spalte). Dann geht's auf jeden Fall mit einer TQuery, auch unter der BDE.

SQL-Code:
Create procedure generator_id (  @IdGenerator varchar(20))
as
begin
      declare @ID integer

      SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
      BEGIN TRANSACTION SP_GEN_ID

      select @ID = CurrentValue from Generators where IdGenerator =@IdGenerator
      IF @@ERROR <> 0 GOTO LBL_ERROR
      update Generators set CurrentValue =CurrentValue + 1 where IdGenerator=@IdGenerator
      IF @@ERROR <> 0 GOTO LBL_ERROR

      COMMIT TRANSACTION SP_GEN_ID
      select @ID as NewID -- Statt return @ID
      return (0) -- fehlte sowieso

LBL_ERROR:
      ROLLBACK TRANSACTION SP_GEN_ID
      select 0 as NewID -- Statt return 0
      return (1)
end

Elvis 29. Okt 2007 14:12

Re: Mehr Benutzer Primary Key Insert in Tabelle
 
@alzhaimar
Ups, sorry. Irgendwie dachte ich er benutzt Firebird... :gruebel:

btw: Kannst du keine Warnungen schreiben bevor du TSQL Sourcen zeigst? Ich habe gerade gegessen, da kommt das nicht so gut! :shock:

Brainshock 29. Okt 2007 15:13

Re: Mehr Benutzer Primary Key Insert in Tabelle
 
@alzaimar: Danke für das umschreiben, habs noch nicht so mit den Funktionen in T-SQL.

Die Funktion aus #18 hab ich erstmal übernommen und sie funktioniert wie gewünscht im SQL Management Studio.
Die Frage ist nur wie das Ganze über die Query funktionieren soll. Mein Test war der:

Delphi-Quellcode:
procedure TMainForm.test1Click(Sender: TObject);
var
  TmpQuery: TmQuery;
begin
  TmpQuery:= DatabaseModule.GetTemporaryQuery;
  try
    TmpQuery.SQL.Text('exec generator_id ''meinetabelle''');
    TmpQuery.Open;
    ShowMessage(TmpQuery.FieldByName('NewID').AsString);
  finally
    TmpQuery.Free;
  end;
end;
Das Ergebnis war der Fehler: 24000:[Microsoft][ODBC Cursor Library] Ungültiger Cursorstatus

Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:05 Uhr.
Seite 2 von 3     12 3      

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