Jump to content

Tabelenfelder mit NOT NULL und Default


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Als Anfänger auf Visual Studio, C# und SQL-Server bitte ich im Voraus um Verzeihung wenn das eine ganz ****e Frage ist. :-)

Ich habe eine Anwendung in Visual Studio mit C#. Die DataGridViews und die Daten darin sind generiert. (Weil ich dann die Felder über Menue steuern kann) Die Tabellen im SQL-Server 2008 haben fast ausschließlich Colums mit NOT NULL und DEFAULT-Werten.

Nach Einfügen eines Satzes in die DataGridView schlägt der Versuch die Daten in die Tabelle zurückzuschreiben fehl, da die nicht belegten Felder angemeckert werden (Column kann kein NULL aufnehmen)

Aus meiner bisherigen Tätigkeit, in der ich meist mit DB2 gearbeitet habe, kenne ich es nur, das nicht belegte Felder mit dem Defaultwert gefüllt werden.

Was mache ich da falsch?

Danke im Voraus für eure Hilfe.

Link zu diesem Kommentar
Die DataGridViews und die Daten darin sind generiert. (Weil ich dann die Felder über Menue steuern kann) Die Tabellen im SQL-Server 2008 haben fast ausschließlich Colums mit NOT NULL und DEFAULT-Werten.

 

Fast ausschließlich heißt, es sind nicht alle gleich konfiguriert.

 

Nach Einfügen eines Satzes in die DataGridView schlägt der Versuch die Daten in die Tabelle zurückzuschreiben fehl, da die nicht belegten Felder angemeckert werden (Column kann kein NULL aufnehmen)

 

Welche Felder werden nicht befüllt? Welche Felder werden in der Fehlermeldung genannt?

 

Aus meiner bisherigen Tätigkeit, in der ich meist mit DB2 gearbeitet habe, kenne ich es nur, das nicht belegte Felder mit dem Defaultwert gefüllt werden.

 

Das ist im allgemeinen auch so beim MS SQL Server.

Link zu diesem Kommentar

Ich habe eine Tabelle, die z.B. Partnerdaten enthält. Hier wir in das Feld Nachname z.B. ein Firmenname eingetragen. Das Feld Vorname bleibt in diesem Fall dann natürlich frei und wird im DataGridView einfach übergangen. Ebenso kann das Feld 'Gültig bis' (Date) frei bleiben und soll dann in der Datenbank mit einem Höchstwert defaultmäßig gefüllt werden.

Sowas sollte doch eigentlich möglich sein, oder?

Link zu diesem Kommentar
Ich habe eine Tabelle, die z.B. Partnerdaten enthält. Hier wir in das Feld Nachname z.B. ein Firmenname eingetragen. Das Feld Vorname bleibt in diesem Fall dann natürlich frei und wird im DataGridView einfach übergangen. Ebenso kann das Feld 'Gültig bis' (Date) frei bleiben und soll dann in der Datenbank mit einem Höchstwert defaultmäßig gefüllt werden.

Sowas sollte doch eigentlich möglich sein, oder?

 

Ja, sowas sollte möglich sein. Ist bestimmt auch möglich. Werden denn die Daten auch in der DB eingetragen, wenn Du im Grid alle Felder ausfüllst? Zeig ein CREATE TABLE Script von der Tabelle her. Das kannst im SQL Server Manager mittels Rechtsklick auf die Tabelle erzeugen.

Link zu diesem Kommentar

Hier das Create-Skript:

 

USE [ParkhausData]

GO

 

/****** Object: Table [dbo].[Partner] Script Date: 02/28/2012 12:08:50 ******/

SET ANSI_NULLS ON

GO

 

SET QUOTED_IDENTIFIER ON

GO

 

CREATE TABLE [dbo].[Partner](

[iD_Partner] [int] IDENTITY(1,1) NOT NULL,

[Dat_Valid_from] [datetime] NOT NULL,

[Dat_Valid_to] [datetime] NOT NULL,

[Name_Partner] [nvarchar](100) NOT NULL,

[Vorname_Partner] [nvarchar](100) NOT NULL,

[Description] [nvarchar](255) NOT NULL,

[iD_Typ_Partner] [int] NOT NULL,

CONSTRAINT [Partner_PK] PRIMARY KEY NONCLUSTERED

(

[iD_Partner] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

 

GO

 

ALTER TABLE [dbo].[Partner] WITH CHECK ADD CONSTRAINT [Partner_FK00] FOREIGN KEY([iD_Typ_Partner])

REFERENCES [dbo].[Typ_Partner] ([iD_Typ_Partner])

ON UPDATE CASCADE

ON DELETE CASCADE

GO

 

ALTER TABLE [dbo].[Partner] CHECK CONSTRAINT [Partner_FK00]

GO

 

ALTER TABLE [dbo].[Partner] ADD DEFAULT (getdate()) FOR [Dat_Valid_from]

GO

 

ALTER TABLE [dbo].[Partner] ADD DEFAULT ('31.12.2999') FOR [Dat_Valid_to]

GO

 

ALTER TABLE [dbo].[Partner] ADD DEFAULT ('') FOR [Name_Partner]

GO

 

ALTER TABLE [dbo].[Partner] ADD DEFAULT ('') FOR [Vorname_Partner]

GO

 

ALTER TABLE [dbo].[Partner] ADD DEFAULT ('') FOR [Description]

GO

 

ALTER TABLE [dbo].[Partner] ADD DEFAULT ((0)) FOR [iD_Typ_Partner]

GO

 

Anscheinend wird von dem DataGridView ein NULL-Wert für die Felder übergeben und dieser wird dann versucht in die Tabelle zu schreiben. Von DB2 kenne ich es eigentlich, dass dann der DEFAULT-Wert zieht. Kann es sein das SQL-Server dann wirklich explizit diesen NULL-Wert schreiben will?

Dann wäre meine Frage vielleicht hie sogar falsch platziert und ich müßte diese bei VISUAL STUDIO oder C# stellen.

Link zu diesem Kommentar

Wenn vom Visual Studio NULL Werte kommen, wirst Du dort die Werte korrigieren müssen. Du kannst zum testen es mit einer kleinen Testtabelle prüfen.

 

USE [TESTDB]
GO

/****** Object:  Table [dbo].[Table_1]    Script Date: 02/28/2012 13:44:12 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Table_1](
[meinTest] [nchar](10) NOT NULL
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Table_1] ADD  CONSTRAINT [DF_Table_1_meinTest]  DEFAULT (N'Test1') FOR [meinTest]
GO

 

In dem Fall wird als DEFAULT Test1 übergeben.

Link zu diesem Kommentar
Also ich habe die Werte nun in den DataGridView-Columns korrigiert. Ich prüfe jeweils auf Null und setze es "typgerecht" um. So geht es nun. Allerdings empfinde ich das als workarround. Aber vielleicht ist das in dem System halt so.

 

Ob das als Workaround oder richtig ist, solltest Du evt. in einem Entwickler Forum klären. Die Antwort würde mich auch interessieren.

Link zu diesem Kommentar

Moin,

 

ich kenne das auch so, dass man nicht NULL als Wert einfügen darf.

Die Online-Hilfe sagt ja auch:

 

"DEFAULT, Gibt den Wert an, der für die Spalte bereitgestellt wird, wenn kein Wert explizit angegeben wurde. "

 

Meint, Du darfst eben keinen Wert für die Spalte angeben. Ein einfügen von NULL ist ungleich "kein Wert", sondern versucht ausdrücklich diese Spalte mit NULL zu füllen und daher wird nicht der DEFAULT-Wert benutzt.

 

Gruß Kai

Link zu diesem Kommentar

Wie gesagt, das DB-Design möchte hier erreichen, dass in die Spalten "NOT NULL" etwas eingefügt werden muss. Z.b. Weil andere Anwendungen, z.B. bei einem Join, ungültige Ergebnisse liefern oder weil die eigentlichen Daten sonst inkonsistent sind.

 

Wenn das DB-Schema bekannt ist und eine Grund für "NOT NULL" nicht mehr besteht, kann man das Schema auch ändern (Alter Table...)

 

-Zahni

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...