Laden...

MSSQL Server Standardwert für Spalte

Erstellt von Rahvin vor 12 Jahren Letzter Beitrag vor 12 Jahren 7.450 Views
R
Rahvin Themenstarter:in
156 Beiträge seit 2006
vor 12 Jahren
MSSQL Server Standardwert für Spalte

verwendetes Datenbanksystem: MSSQL Server 2005

Guten Abend 😃.

Ich habe in meiner Datenbank eine Tabelle für die Einstellungen meines Programmes. Beim 1. Start wird geprüft ob bereits Einstellungen vorliegen. Falls nicht wird ein neuer Datensatz eingefügt, welcher mit Standarwerten aus der Datenbank gefüllt wird. Genau hier liegt mein Problem. Ich erhalte beim Einfügen des Datensatze folgende Exception:

Fehlermeldung:
System.Data.SqlClient.SqlException


Der Wert NULL kann in die 'MediaTypStandardAbspielprioritaet'-Spalte, 'MediaCenter_Neu2.dbo.Einstellungen'-Tabelle nicht eingefügt werden. Die Spalte lässt NULL-Werte nicht zu. Fehler bei INSERT. Die Anweisung wurde beendet.

Die Spalte ist wie folgt definiert:


	[MediaTypStandardAbspielprioritaet] [varchar](7) NOT NULL CONSTRAINT [DF_Einstellungen_MediaTypStandardAbspielprioritaet]  DEFAULT ('1;2;3;4'),

Und hier der C#Code:


...
        private static Einstellungen _einstellungen;

        public static void Init()
        {
            try
            {
                using (DBContext context = new DBContext())
                {
                    _einstellungen = context.Einstellungens.FirstOrDefault();

                    if (_einstellungen == null)
                    {
                        _einstellungen = new Einstellungen();
                        context.Einstellungens.InsertOnSubmit(_einstellungen);
                        context.SubmitChanges();
                    }
                }
            }
            catch (Exception e)
            {
                TraceMaster.HandleException(e, "Einstellungen konnten nicht initialisiert werden");
            }
        }
...

Wenn ich über das Managament Studio eine neue Zeile in die Tabelle einfüge klappt das wunderbar, nur nicht über meinen Code. Hat jemand eine Ahnung wo mein Problem liegt?

C
1.214 Beiträge seit 2006
vor 12 Jahren

Was ist _einstellungen? Steht da vielleicht in der entsprechenden Spalte null drin?

R
Rahvin Themenstarter:in
156 Beiträge seit 2006
vor 12 Jahren

Was ist _einstellungen? Steht da vielleicht in der entsprechenden Spalte null drin?

_einstellungen ist einfach ein statisches Datebankobjekt. Es wird zuerst versucht die Einstellungen aus der Datenbank auszulesen.


_einstellungen = context.Einstellungens.FirstOrDefault();

Klappt das nicht, so sollen die Einstellungen neu in die Datenbank geschrieben werden (Mit den in der Datenbank hinterlegten Standardwerten).


                    if (_einstellungen == null)
                    {
                        _einstellungen = new Einstellungen();
                        context.Einstellungens.InsertOnSubmit(_einstellungen);
                        context.SubmitChanges();
                    }

C
1.214 Beiträge seit 2006
vor 12 Jahren

Das ist mir klar ^^ Aber was sind diese default Einstellungen, was stehen da für Werte drin? Das führt ja offensichtlich zu einer Query, die NULL in die Spalte MediaTypStandardAbspielprioritaet schreiben will, und das muss ja irgendwo her kommen.

R
Rahvin Themenstarter:in
156 Beiträge seit 2006
vor 12 Jahren

Der Defaultwert sollte aus der Datebank selbst kommen:


CREATE TABLE [dbo].[Einstellungen](
	[MediaPath] [text] NULL,
	[BildPath] [text] NULL,
...
	[MediaTypStandardAbspielprioritaet] [varchar](7) NOT NULL CONSTRAINT [DF_Einstellungen_MediaTypStandardAbspielprioritaet]  DEFAULT ('1;2;3;4'),
...

C
1.214 Beiträge seit 2006
vor 12 Jahren

Nein. Das funktioniert nur, wenn du KEINEN Wert angibst. Wenn du null übergibst, wird er auch versuchen, Null in die Spalte zu schreiben und das führt zu dieser Exception.

R
Rahvin Themenstarter:in
156 Beiträge seit 2006
vor 12 Jahren

Nein. Das funktioniert nur, wenn du KEINEN Wert angibst. Wenn du null übergibst, wird er auch versuchen, Null in die Spalte zu schreiben und das führt zu dieser Exception.

Sorry, vielleicht bin ich ja gerade völlig blöd aber ich übergebe doch keinen Wert.
Ich leg ein neues Objekt an und möchte es mit den Standardwerten in der DB speichern:


 _einstellungen = new Einstellungen();
context.Einstellungens.InsertOnSubmit(_einstellungen);
context.SubmitChanges();

C
1.214 Beiträge seit 2006
vor 12 Jahren

Und was sind die Standardwerte? Da gibt es sowas wie "Kein Wert" nicht. Das wird wahrscheinlich null sein. Zeig mal die Definition der Klasse Einstellungen.

R
Rahvin Themenstarter:in
156 Beiträge seit 2006
vor 12 Jahren

Ups, hab vergessen zu erwähnen, dass ich Linq2SQL verwende 😉. Es ist eine autogenerierte Klasse:


...
		[Column(Storage="_MediaTypStandartAbspielprioritaet", DbType="VarChar(7)", CanBeNull=false)]
		public string MediaTypStandartAbspielprioritaet
		{
			get
			{
				return this._MediaTypStandartAbspielprioritaet;
			}
			set
			{
				if ((this._MediaTypStandartAbspielprioritaet != value))
				{
					this.OnMediaTypStandartAbspielprioritaetChanging(value);
					this.SendPropertyChanging();
					this._MediaTypStandartAbspielprioritaet = value;
					this.SendPropertyChanged("MediaTypStandartAbspielprioritaet");
					this.OnMediaTypStandartAbspielprioritaetChanged();
				}
			}
		}
...

Den Standardwert "1;2;3;4" habe ich im Management Studio in der Datenbank hinterlegt:
[MediaTypStandardAbspielprioritaet] varchar NOT NULL CONSTRAINT [DF_Einstellungen_MediaTypStandardAbspielprioritaet] DEFAULT ('1;2;3;4').

Vielleicht stehe ich ja gerade völlig auf dem Schlauch aber nach meinem Verständnis sollte die DB selbstständig den Default-Wert "1;2;3;4" eintragen, falls ich im Code den Wert nicht setze.... Default-Wert halt.

So... muss morgen früh wieder fit für die Arbeit sein, daher hau ich mich jetzt erstmal hin. Danke für Deine Hilfe!

C
2.122 Beiträge seit 2010
vor 12 Jahren

Mach doch nochmal von vorne.
Was steht zum Zeitpunkt des Eintragens im betreffenden Feld drin?
Kanns sein dass da halt doch null drin steht und Linq2Sql macht dann in der Query null draus? Ich kenn Linq2Sql nicht.
Wie sieht das SQL aus, kann man das irgendwie anschauen?

1.564 Beiträge seit 2007
vor 12 Jahren

Hi

Datenbankseitig definierte DEFAULT Werte bringen in Verbindung mit O/R-Mappern nichts. Wie Coder007 schon gesagt hat, greifen DEFAULT Werte nur wenn die Spalte gar nicht im INSERT Statement enthalten ist, nicht wenn sie mit dem Wert NULL übergeben wird - und genau das ist das was der ORM macht.

Beispiel..

Gehen wir von folgender Tabelle aus:


CREATE TABLE Foo (
   Id INT NOT NULL IDENTITY(1,1) PRIMARY KEY CLUSTERED
   ,Bla INT NOT NULL
   ,Bluf VARCHAR(10) NOT NULL DEFAULT '1,2,3'
);

Ein valides INSERT Statement wäre:


INSERT INTO Foo (Bla) VALUES (1);

Der ORM erzeugt jedoch:


INSERT INTO Foo (Bla, Bluf) VALUES (1, NULL);

BTW:
Dein default Wert '1;2;3;4' richt nach einem Verstoß der ersten Normalisierungsform 😉.

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

3.511 Beiträge seit 2005
vor 12 Jahren

Datenbankseitig definierte DEFAULT Werte bringen in Verbindung mit O/R-Mappern nichts

Ganz so pauschal würde ich das nicht sagen. NHibernate kann sowas 😃

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

1.564 Beiträge seit 2007
vor 12 Jahren

Hi Khalid

Danke für die Aufklärung 😃 ! Wusste ich nicht.

Viele Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

R
Rahvin Themenstarter:in
156 Beiträge seit 2006
vor 12 Jahren

Das könnte natürlich der Grund sein 😃. Danke für die Antwort.

Ich werde dann mal eine StoredProcedure schreiben die ein INSERT ohne NULL-Werte macht 😃.

C
1.214 Beiträge seit 2006
vor 12 Jahren

Da gibt es auch was zu dem Thema:

Handling Default Values With LINQ to SQL