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?
Was ist _einstellungen? Steht da vielleicht in der entsprechenden Spalte null drin?
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();
}
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.
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'),
...
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.
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();
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.
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!
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?
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ß.
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)
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ß.
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 😃.
Da gibt es auch was zu dem Thema: