Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Autoincrement funktioniert nicht ??? (https://www.delphipraxis.net/129338-autoincrement-funktioniert-nicht.html)

myownshadow 17. Feb 2009 10:53

Datenbank: MSSQL Express • Version: 2005 • Zugriff über: DBExpress

Autoincrement funktioniert nicht ???
 
Hallo !
Ich habe eine MSSQL Datenbank mit dem "MS SQL Server Management Studio Express" erstellt und möchte die nun bearbeiten.

Ich habe mit TSQLConnection eine Verbindung zur Datenbank hergestellt, funktioniert. Anschließend schau ich mit TSimpleDataSet auf eine Tabelle und möchte den Inhalt über TDatasource in einem TDBGrid darstellen.
Zur Navigation benutze ich dan TDBNavigator.
So weit so gut.

Immer wenn ich mit dem TDBNavigator einen neuen Datensatz erzeuge und später speichern will, erhalte ich eine Exception, da das Feld meines PrimSchlüssels leer ist.
Aber müsste der sich denn nicht selbst incrementieren ? Oder muss ich das selbst tun ?

Wenn ich mit dem Management Studio einen neuen Datensatz anlege, funktioniert das autoincrement immer.

Vielen dank

Satty67 17. Feb 2009 11:10

Re: Autoincrement funktioniert nicht ???
 
Also bei FB ist das ja etwas anders... Hat das Autoinc Feld auch noch den Wert "NOT NULL"? Normalerweise das Autoinc Feld nicht als Pflichtfeld definieren (damit man es weglassen kann), da ja erst hinterher von der DB-Engine ein Wert eingesetzt wird.

mkinzler 17. Feb 2009 11:13

Re: Autoincrement funktioniert nicht ???
 
Zitat:

Also bei FB ist das ja etwas anders... Hat das Autoinc Feld auch noch den Wert "NOT NULL"? Normalerweise das Autoinc Feld nicht als Pflichtfeld definieren (damit man es weglassen kann), da ja erst hinterher von der DB-Engine ein Wert eingesetzt wird.
Die automatische Füllung hat nichts mit NOT NULL zu tun. Wird es serverseitig automatisch gefüllt, darf es u.U. auf dem Client nicht gefüllt werden

nahpets 17. Feb 2009 11:17

Re: Autoincrement funktioniert nicht ???
 
Hallo,
Zitat:

Zitat von myownshadow
Hallo !
Ich habe eine MSSQL Datenbank mit dem "MS SQL Server Management Studio Express" erstellt und möchte die nun bearbeiten.

Ich habe mit TSQLConnection eine Verbindung zur Datenbank hergestellt, funktioniert. Anschließend schau ich mit TSimpleDataSet auf eine Tabelle und möchte den Inhalt über TDatasource in einem TDBGrid darstellen.
Zur Navigation benutze ich dan TDBNavigator.
So weit so gut.

Immer wenn ich mit dem TDBNavigator einen neuen Datensatz erzeuge und später speichern will, erhalte ich eine Exception, da das Feld meines PrimSchlüssels leer ist.
Aber müsste der sich denn nicht selbst incrementieren ? Oder muss ich das selbst tun ?

Wenn ich mit dem Management Studio einen neuen Datensatz anlege, funktioniert das autoincrement immer.

Vielen dank

aufgrund der Fehlerbeschreibung vermute ich, dass der Client nicht weiß, dass der Primärschlüssel erst von der Datenbank gefüllte wird und deshalb das Fehlen des Wertes bemängelt.

Was passiert, wenn Du für den Primärschlüssel einen Wert eingibst, wird der dann gespeichert oder wird der Wert gespeichert, den die Datenbank automatisch vergibt oder erhälst Du von der Datenbank eine Fehlermeldung, dass für das Feld kein Wert eingegeben werden darf?

Satty67 17. Feb 2009 11:22

Re: Autoincrement funktioniert nicht ???
 
Zitat:

Zitat von mkinzler
Die automatische Füllung hat nichts mit NOT NULL zu tun. Wird es serverseitig automatisch gefüllt, darf es u.U. auf dem Client nicht gefüllt werden

Ja, aber er lässt ja das Feld absichtlich leer. Dachte also das die DB erstmal einen Wert erwartet (weil definiert), ohne zu Wissen, dass es sowieso später gefüllt wird. Somit einfach Pflichtfeld entfernen und Problem gelöst?

mkinzler 17. Feb 2009 11:23

Re: Autoincrement funktioniert nicht ???
 
In diesem Fall könnte man auch mit einer Sequenz arbeiten (Client holt sich Wert und fügt ihn ein)

myownshadow 17. Feb 2009 12:30

Re: Autoincrement funktioniert nicht ???
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zunächst vielen Dank für die schnellen Antworten.

Zunächst habe ich auch selbst einen Wert eingegeben, aber dann beschwert sich die Datenbank mit einem "EDatabaseError" darüber, das ich dies tue.

So, nun habe ich im TSimpleDataSet das faRequired auf false gesetzt (so war es doch gemeint, nicht wahr ?).
Die Fehlermeldung "EDatabaseError" bleibt jedoch erhalten.

chericks 17. Feb 2009 12:43

Re: Autoincrement funktioniert nicht ???
 
Setz mal bei dem Feld die Spalteneigenschaft '(Ist-Identity)' auf 'Ja' und den Datentyp auf Int. Das sollte reichen.

myownshadow 17. Feb 2009 13:02

Re: Autoincrement funktioniert nicht ???
 
Schwierige Geburt....
InTSimpleDataSet.FieldDefs habe ich den DataType auf ftInteger bzw. auch einmal auf ftAutoInc gesetzt.

Beides ändert leider nichts.

Wo finde ich aber die Spalteneigenschaft '(Ist-Identity)' ?

chericks 17. Feb 2009 13:35

Re: Autoincrement funktioniert nicht ???
 
Hätte ich auch mit reinschreiben sollen...

Meinte im "MS SQL Server Management Studio Express" die Tabelle auswählen, rechte maustaste auf die Tabelle, und im Popupmenü auf "ändern". Das Feld auswählen,Datentyp auf Int und unten in der Liste dann halt '(Ist-Identity)' auf 'Ja'.

myownshadow 17. Feb 2009 13:41

Re: Autoincrement funktioniert nicht ???
 
Liste der Anhänge anzeigen (Anzahl: 1)
Klar, dass hatte ich schon (habe immer in Delphi gesucht ...)

chericks 17. Feb 2009 14:05

Re: Autoincrement funktioniert nicht ???
 
Liste der Anhänge anzeigen (Anzahl: 1)
Sieht bei mir etwas anders aus, habe den vollen Server hier. Bei mir reichen diese Einstellungen, damit die Datenbank selbst eine Nummer einfügt.

myownshadow 17. Feb 2009 14:28

Re: Autoincrement funktioniert nicht ???
 
Liste der Anhänge anzeigen (Anzahl: 1)
Dann liegt mein Fehler ganz klar doch im Delphi.
Wie hast du denn deine Verbindung zu rDatenbank hergestellt ?
Auch über TSQLConnection - TSimpleDataset - TDataSource - TDBGrid - TDBNavigator

Satty67 17. Feb 2009 14:37

Re: Autoincrement funktioniert nicht ???
 
Bei Nr_Kunde steht "Null zulassen" = Nein bzw. ist kein Häckchen gesetzt.

Das wäre zumindest was ich gemeint hatte, hier NULL zulassen.

chericks 17. Feb 2009 14:40

Re: Autoincrement funktioniert nicht ???
 
Ich bevorzuge die Ado-Komponenten.
Delphi-Quellcode:
 
var
  ado_connection : TAdoConnection;
  ado_query : Tadoquery;
begin
  ado_connection := TAdoConnection.Create(NIL);
  ado_connection.ConnectionString :=
    'Provider=' + DB_provider + ';' +
    'Password=' + DB_password + ';' +
    'Persist Security Info=' + DB_security + ';' +
    'User ID=' + DB_user + ';' +
    'Initial Catalog=Master;' +
    'Data Source=' + DB_datasource;
  ado_connection.LoginPrompt := false;
  ado_connection.Connected := true;

  ado_query := Tadoquery.create(NIL);
  ado_query.Connection := ado_connection;
  ado_query.SQL.add('select * from kunden;');
  ado_query.Open;
Glaube aber nicht das es an den Komponenten von Delphi liegt, denke eher die Fehlermeldung wird von der Datenbank erzeugt und zurück zum Programm geschickt.

chericks 17. Feb 2009 14:43

Re: Autoincrement funktioniert nicht ???
 
Mal anderes herum. Wennn du dir die Tabelle im "MS SQL Server Management Studio Express" anzeigen läßt und Datensätze hinzufügst, wird dann automatisch die Nummer vergeben?

myownshadow 17. Feb 2009 14:49

Re: Autoincrement funktioniert nicht ???
 
Das geht doch aber nicht, ist ja ein Primärschlüssel

myownshadow 17. Feb 2009 14:51

Re: Autoincrement funktioniert nicht ???
 
Ja, im Management studio funktioniert alles wunderbar.
Deshalb kann es ja nur irgendeine Kleinigkeit im Delphi sein

myownshadow 17. Feb 2009 15:38

Re: Autoincrement funktioniert nicht ???
 
So, nun versuche ich es auch einmal mit TADO.
Aber da kommt schon das nächste Problem auf mich zu.
Ich habe ja MSSQL 2005 express.
Welcher Provider ist dafür der Richtige ?
Irgendwie klappt es mit keinem mich an der Datenbank einzuloggen.
Dabei ist Fr, der 13. doch schon vorbei ?!

nahpets 18. Feb 2009 07:43

Re: Autoincrement funktioniert nicht ???
 
Hallo,
Zitat:

Zitat von myownshadow
So, nun versuche ich es auch einmal mit TADO.
Aber da kommt schon das nächste Problem auf mich zu.
Ich habe ja MSSQL 2005 express.
Welcher Provider ist dafür der Richtige ?
Irgendwie klappt es mit keinem mich an der Datenbank einzuloggen.
Dabei ist Fr, der 13. doch schon vorbei ?!

benutze immer den Mircosoft OLE DB Provider for SQL Server, habe mir da noch nie Gedanken darüber gemacht, welche SQL-Server-Version da letztlich benutzt wird.
Auf dem zweiten Reiter (Verbindung) muss man unter 1. zuweilen Rechnername oder IP-Adresse eingeben, da hier nicht immer alle verfügbaren SQL-Server aufgelistet werden.

myownshadow 18. Feb 2009 09:23

Re: Autoincrement funktioniert nicht ???
 
So, nun funktioniert es. Es war wohl Gestern schon zu spät.
Hatte einen Fehler im connection string. Im Data Sourde schaute der Backslash in die falsche Richtung.

Delphi-Quellcode:
  object ADOConnection1: TADOConnection
    Connected = True
    ConnectionString =
      'Provider=SQLNCLI.1;Integrated Security=SSPI;Persist Security Inf' +
      'o=False;Initial Catalog=KalkulationsDaten;Data Source=MY_PC-1\SQLEXPRESS'
    LoginPrompt = False
    Provider = 'SQLNCLI.1'
    Left = 50
    Top = 255
  end
Nach dem das dann ging, war der Rest erfreulich einfach.
TADOTable, TADOQuery, TDataSource, TDBGrid, TDBNavigator verknüpft und schon spielt alles.
Meine Tabellenschlüssel werden auch automatisch incrementiert.
So wie es sein soll.

Vielen Dank für eure gedultige Hilfe.
In manch anderen Foren wird man ja als unwissender richtig fertig gemacht.


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