Announcement

Collapse
No announcement yet.

Verständnisfrage zu DEFAULT bei CREATE TABLE

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

  • Verständnisfrage zu DEFAULT bei CREATE TABLE

    Hallo Forum,

    ich habe das Problem, dass ich manchen Feldern in einer Tabelle einen Defaultwert zuweisen muss/möchte wenn ein neuer Datensatz angelegt wird.
    Also dachte ich mir, das kann ich sicher beim erzeugen der leeren Datenbank bereits entsprechend über CREATE TABLE angeben. Das funktioniert auch fehlerfrei wenn ich z.B. mit folgendem CommandText eine Tabelle erstelle:

    "CREATE TABLE TestTabelle (ID int IDENTITY NOT NULL CONSTRAINT pk_ID PRIMARY KEY, Feld1 Smallint DEFAULT 9"

    Wenn ich nun einen neuen Datensatz anlege müsste doch in der Spalte "Feld1" der Wert 9 stehen wenn ich keinen Wert für die Spalte angebe, oder sehe ich das falsch. Fakt ist, dass beim anlegen eines neuen Datensatzes nicht der Defaultwert 9 steht sondern System.DBNull. Kann mir jemand sagen wie ich es anstelle, dass für bestimmte Felder Defaultwerte beim anlegen neuer Datensätze eingetragen werden anstatt System.DBNull?

    Vielen Dank für Eure Hilfe im Voraus!!

    Gruß,
    Uwe.

  • #2
    Hallo,

    wie fügst du den Eintrag hinzu? Der Default-Wert wird in der Datenbank gesetzt, somit schlägst sich das auf der Client-Seite erst nach einem Save (o.ä.) nieder.

    Probiere mal direkt in der DB per INSERT-Statement.

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Wo anlegen und wo steht die null? In deiner Anwendung oder in deiner Datenbank? System.DBNull hört sich nach ADO.Net an. Wenn du einen Datensatz anlegst wird der Default Wert frühestens in deiner ADO.NEt Datenmenge eingetragen wenn du die auch in der Datenbank speicherst und dir den dann auch explizit wieder aus der Datenbank abholst. Wenn der Default Wert erst gar nicht in der Datenbank ziehst hast du vermutlich die Insert so erzeugt (oder erzeugen lassen) das die halt für deine Spalte einen Wert senden und wenn du den dann im Code nicht setzt wird halt null an die Datenbank gesendet und nicht nichts was du bräuchtest damit der Default zieht.

      Wenn du mit ADO.Net arbeitest ist es in den meisten Fällen sinnvoller die Defaults lokal zu setzen und nicht in der Datenbank. Das Ping-Pong nach dem Eintragen der Daten um potentielle Änderungen durch Defaults wieder abzuholen und lokal einzutragen ist schwierig lückenlos und performant umzusetzen. Am besten erst gar nicht damit anfangen wenn deine Anwendung der einzige Weg sein soll mit der DB zu kommunizieren.

      Comment


      • #4
        Hallo Gü, hallo Ralf,

        danke für Eure Antworten. Hhhm, ich bin nun ein wenig verwirrt.
        Ich versuchs nochmal zu erklären.
        Also es handelt sich grundsätzlich um .NET.
        Wenn ich wie oben beschrieben mit CREATE TABLE für das ein oder andere Tabellen-Feld einen Defaultwert festlege und ich dann einen Datensatz in die noch leere Tabelle schreibe, egal ob nun mit INSERT INTO oder über New .Row und danach ein .update mache, bin ich davon ausgegangen, das wenn ich die Felder denen bei CREATE TABLE ein DEFAULT zugewiesen wurde, nicht explizit einen anderen Wert zuweise bzw. die Felder gar nicht angebe, das diesen Feldern dann der DEFAULT zugewiesen wird.
        Sorry, vielleicht kann ich mich auch nicht so gut ausdrücken gerade.

        Hier nochmal ein Beispiel:
        "CREATE TABLE TestTabelle (ID int IDENTITY NOT NULL CONSTRAINT pk_ID PRIMARY KEY, Feld1 Smallint, Feld2 nvarchar(50) DEFAULT 'Standardwert', Feld3 Smallint"

        Wenn ich nun einen neuen Datensatz anlege und nur den Feldern "Feld1" und "Feld3" explizit Werte zuweise und "Feld2" gar nicht anspreche, dann müsste doch in "Feld2" automatisch 'Standardwert' stehen und nicht wie bei mir System.DBNull also ein NULLVALUE, oder verstehe ich das falsch?

        Hoffe Ihr könnt nun mehr mit meinem Problem anfangen.

        Nochmals Danke für Eure Hilfe im Voraus!

        Grüße,
        Uwe.

        Comment


        • #5
          Wenn ich nun einen neuen Datensatz anlege und nur den Feldern "Feld1" und "Feld3" explizit Werte zuweise und "Feld2" gar nicht anspreche, dann müsste doch in "Feld2" automatisch 'Standardwert' stehen und nicht wie bei mir System.DBNull also ein NULLVALUE, oder verstehe ich das falsch?
          Kommt drauf an. Du verwendest zum updaten was aus der TableAdapter/DataAdapter Ecke? Dann werden immer alle Felder an die Datenbank gesendet. Die können nicht unterscheiden ob in einem Feld null steht weil du null reingeschrieben hast oder ob da null steht weil das Feld nicht angefasst wurde und generiert immer ein vollständiges SQL. Das was du als Standardwert bezeichnest würde da nur stehen wenn du ein typisiertes Dataset verwendest und den Standardwert dort bei der Spalte hinterlegt hast. Diesem Standardwert ist der Default in der Datenbank aber herzlich egal. Wer ja auch ein ziemlicher Bremsklotz wenn bei jedem erstellen eines neuen Datensatz in einer Datatable erstmal in der eigentlich Datenabnk gecheckt werden würde ob da irgendwelche Defaults rumliegen.

          Comment


          • #6
            Hallo Ralf,

            danke für die Erklärung, das leuchtet ein. Ja, ich verwende DataAdapter.
            Ich dachte, wenn ich die Tabelle tatsächliche in der Datenbank update, hätten beim nächsten lesen der Tabelle, die Felder die nicht angefasst wurden und in der DB einen DEFAULT zugewiesen haben, diesen DEFAULT-Wert dann haben und eben nicht NULL.
            Verstehe ich das richtig, dass ich also gar keine Möglichkeit habe, Felder die nicht angefasst wurden einen Standardwert beim anlegen eines neuen Datensatzes zuzuweisen?

            Comment


            • #7
              Verstehe ich das richtig, dass ich also gar keine Möglichkeit habe, Felder die nicht angefasst wurden einen Standardwert beim anlegen eines neuen Datensatzes zuzuweisen?
              Insert Trigger der auch bei einer expliziten NULL deinen Default setzt. Dann mußt du dich aber immer noch darum kümmern das der Wert auch wieder zurück in deine DataTable kommt. Das macht der nicht von allein. Vielleicht hat ein DataAdapter mittlerweile, hab den schon länger nicht mehr verwendet, eine Property mit der man sagen kann das nach einem Insert automatisch ein passender Select abgesetzt werden soll der potentiell veränderten Daten abholt und in die DataTable zurückschreibt.

              Comment


              • #8
                Hhhm, ok, das werde ich mir mal anschauen.
                Erstmal vielen Dank für die Hilfe.
                Sollte ich widererwarten nicht weiter kommen, melde ich mich nochmal.

                Grüße,
                Uwe.

                Comment

                Working...
                X