Haucke 10 Geschrieben 27. Februar 2012 Melden Teilen Geschrieben 27. Februar 2012 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. Zitieren Link zu diesem Kommentar
zahni 554 Geschrieben 27. Februar 2012 Melden Teilen Geschrieben 27. Februar 2012 Hallo und willkommen im Forum. Du hast eine Spalte, die Du mit Daten füllen musst. Die darf nicht leer sein. Zitieren Link zu diesem Kommentar
Sunny61 806 Geschrieben 27. Februar 2012 Melden Teilen Geschrieben 27. Februar 2012 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. Zitieren Link zu diesem Kommentar
Haucke 10 Geschrieben 27. Februar 2012 Autor Melden Teilen Geschrieben 27. Februar 2012 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? Zitieren Link zu diesem Kommentar
Sunny61 806 Geschrieben 28. Februar 2012 Melden Teilen Geschrieben 28. Februar 2012 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. Zitieren Link zu diesem Kommentar
Haucke 10 Geschrieben 28. Februar 2012 Autor Melden Teilen Geschrieben 28. Februar 2012 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. Zitieren Link zu diesem Kommentar
Sunny61 806 Geschrieben 28. Februar 2012 Melden Teilen Geschrieben 28. Februar 2012 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. Zitieren Link zu diesem Kommentar
Haucke 10 Geschrieben 28. Februar 2012 Autor Melden Teilen Geschrieben 28. Februar 2012 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. Zitieren Link zu diesem Kommentar
Sunny61 806 Geschrieben 28. Februar 2012 Melden Teilen Geschrieben 28. Februar 2012 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. Zitieren Link zu diesem Kommentar
hh2000 10 Geschrieben 1. März 2012 Melden Teilen Geschrieben 1. März 2012 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 Zitieren Link zu diesem Kommentar
zahni 554 Geschrieben 1. März 2012 Melden Teilen Geschrieben 1. März 2012 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 Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.