Hallo zusammen,
ich nerve schon wieder wegen meines DatumUpdates:
In meiner Tabelle sind einige Daten mit Geburtsdatum einige Ohne,
das Anzeigen der Daten in beiden Fällen klappt.
Allerdings bekomme ich, bei meinem Update (wenn das Feld txt_GeburtsDatum leer ist) die Fehlermeldung: "Die Zeichenfolge wurde nicht als gültiges DateTime erkannt"
Wie muss ich hier vorgehen, um ein leeres Feld zu akzeptieren?
Meine Funktion:
private void GeburtsDatum_Aktualisieren()
{
string str_VRN = txt_VRN.Text;
string str_GeburtsDatum = txt_GeburtsDatum.Text;
str_GeburtsDatum = Convert.ToDateTime(str_GeburtsDatum).ToShortDateString();
SqlCommand cmd_GebUpdate = new SqlCommand();
cmd_GebUpdate.Connection = conn;
cmd_GebUpdate.Parameters.Add("@vrn", txt_VRN.Text);
cmd_GebUpdate.Parameters.Add("@geburtsdatum", str_GeburtsDatum);
cmd_GebUpdate.CommandText = "UPDATE <Tabelle> SET geburtsdatum = @geburtsdatum WHERE vrn = @vrn";
cmd_GebUpdate.ExecuteNonQuery();
}
Habe versucht:
IF TextBox leer DateTime _GeburtsDatum = DBNull
Aber das funktioniert nicht so richtig, weil hier DBNull als Variable fungieren würde.
Danke für Eure Hilfe
Suche einmal nach DateTime AND DBNull; da solltest Du Hinweise finden. Das Thema wurde schon mehrfach besprochen. Jürgen
Hallo Danke für den Tipp,
habe mir eben die Tehemen angesehen, aber keine funktionierende Lösung gefunden.
Ich kann meinem DateTime _GeburtsDatum nicht den Wert DBNull zuweisen!
Da DBNull nicht in DateTime convertiert werden kann.
Ich frage ab:
if(txt_GeburtsDatum.Text == "")
_GeburtsDatum = Convert.DBNull.Value;
dann Update-Command
aber sooo geht das nicht?
Wie muss es denn bei meinem Beispiel aussehen?
Danke für Eure Hilfe
if(txt_GeburtsDatum.Text == "")
cmd_GebUpdate.Parameters.Add("@geburtsdatum", null);
else
cmd_GebUpdate.Parameters.Add("@geburtsdatum", tmpGebTag.ToString());
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...
Hallo kleines_eichhoernchen;
danke für deine Antwort, leider klappt dies auch nicht.
Bekomme wieder die gleiche Fehlermeldung:
"Die Zeichenfolge wurde nicht als gültiges DateTime erkannt"
Habe diese Frage schon in einem anderen Forum besprochen und in anderen Threads gesucht, aber keine funktionierende Lösung gefunden oder ein Beispiel für den Einsatz mit DBNull, daß ich in meinem Fall anwenden kann.
Vorher hatte ich mit mysql gearbeitet, dort wurde ohne zu "meckern" einfach NULL in die Tabelle geschrieben, wenn das Textfeld leer war.
Vielleicht gibt es ja doch eine Lösung?
Hallo Deletemaster,
aktzeptiert deine Spalte in der DATENBANK-TABELLE überhaupt null als Defaultvalue? Ein richtiges NULL und nichts anderes!
Dann probiere bitte erstmal auf der Console oder mit einem anderen Tool ein Update etc. mit deinen zu erwartenden Werten und auch solche die nicht rein dürfen.
Was passiert da?
Gruß falangkinjau
Hallo,
ich habe ein kleines Programm zum testen, in dem ich eine Query in ein TextFeld eingebe, den Inhalt des TextFeldes an meine Variable str_QueryString übergebe:
UPDATE <Tabelle> SET geburtsdatum = null WHERE vrn = '1234567'
Hier wird der Befehl ausgeführt!
bei UPDATE <Tabelle> SET geburtsdatum = '' WHERE vrn = '1234567'
wird der 01.01.1900 in die Tabelle geschrieben!
Hallo Deletemaster,
steht jetzt in der Datenbanktabelle wirklich null (NICHTS) drin? Also auch kein leerer String oder sowas.
Wenn dem so ist, dann probiere mal als nächsten Schritt die Absetzung des Befehls ohne Nutzung von Parametern:
cmd_GebUpdate.CommandText = "UPDATE <Tabelle> SET geburtsdatum = null WHERE vrn = 1234"; // für null sollte auch DEFAULT gehen, so jedenfalls bei MySql bei MSSQL weiß ich es nicht
Worauf ich hinaus möchte ist das ich vermute, daß du in deiner Tabelle die Spalte Datum NOT NULL definiert hast und null bzw. ein leerer Text ist halt kein gültiger Datumswert.
Schau mal nach!
Gruß falangkinjau
Hallo falangkinjau,
hab das jetzt mal probiert:
private void GeburtsDatum_Aktualisieren()
{
string str_VRN = txt_VRN.Text;
DateTime _GeburtsDatum;
string str_GeburtsDatum = txt_GeburtsDatum.Text;
//_GeburtsDatum = Convert.ToDateTime(str_GeburtsDatum);
SqlCommand cmd_GebUpdate = new SqlCommand();
cmd_GebUpdate.Connection = conn;
cmd_GebUpdate.Parameters.Add("@vrn", txt_VRN.Text);
//cmd_GebUpdate.Parameters.Add("@GeburtsDatum", _GeburtsDatum);
cmd_GebUpdate.CommandText = "UPDATE <Tabelle> SET geburtsdatum = null WHERE vrn = @vrn";
cmd_GebUpdate.ExecuteNonQuery();
}
Jetzt bekomme ich zwar keine Fehlermeldung mehr, aber
Logischerweise wird jetzt aber auch das GeburtsDatum nicht aktualisiert, wenn es eingetragen wird, weil es wird ja nirgends übergeben
Hallo Deletemaster,
nö, so kommen wir nicht weiter.
Wie sieht deine Tabellenstruktur aus????? Zeig mal wie die DDL für die Spalte Datum aussieht.
So was in der Art möchte ich von dir sehen:
Create Table xxxx
(
spaltedatum DATETIME NOT NULL DEFAULT XXX,
);
Gruß falangkinjau
Hallo,
die Tabellenstruktur sieht so aus:
geburtsdatum datetime
NICHT NOT NULL
KEIN DEFAULT
Lasse mir gerade die Struktur mit MS SQL Maestro anzeigen.
Beim erzeugen der Tabelle habe ich lediglich:
CREATE TABLE <Tabelle>
...
...
geburtsdatum datetime,
...
...
Wenn das deine Struktur ist, warum willst Du dann immer umbedingt einen String da reinschreiben?
Der String wird ja üblicherweise in das DateTime-Format Convertiert.
Hier bloß auskommentiert.
Wenn ich das Feld nicht leer lasse, gibt es auch keine Probleme
Nur wenn das Feld leer bleibt:
" wird die Zeichenfolge nicht als gültiges DateTime erkannt".
Deswegen ja mein Einwand.
Wenn Du mal verstehen würdest, welchen unterschied es macht, einen String
oder einen DateTime als Parameter zu haben, dann würde sich diese Frage nicht mehr stellen.
Einen DateTime muss die DB nicht mehr umwandeln, und ein DBNull würde funktionieren.
Hallo Fzelle,
wie muss denn aber nun meine Funktion aussehen, damit sie funktioniert?
Es werden Daten aus einer Tabelle geladen und in verschiedenen Steuerelementen angezeigt.
Wenn in einem DS kein Datumswert vorhanden ist, wird auch nichts dargestellt.
Wenn nun der Update-Befehl kommt, wird jeder Inhalt der Steuerelemente in die Tabelle zurückgeschrieben.
Gibt der Benutzer in das Textfeld Geburtsdatum nun einen wert ein, z.B. 19.01.1968 steht dieser ja zunächst als Zeichenkette in der Variablen txt_GeburtsDatum.Text
dieser string wird nun zum Datum convertiert.
Ich habe nun versucht über DBNull Informationen zu erlangen, aber keine Lösung gefunden, die mein Problem beschreibt.
Deshalb die Frage:
Wie muss meine Funktion geändert werden, damit bei fehlendem GeburtsDatum null in die Tabelle geschrieben wird?
Danke für Deine Hilfe
Hallo Deletemaster,
ich habe das mal ausprobiert mit MSSQLEXPRESS. Meine erste Tabelle und Zugriff auf ein MSSQL-Server. 😁
Habe mir eine Tabelle gebastelt oder besser zusammen geklickt:
USE [TEST]
GO
/****** Objekt: Table [dbo].[TestDeletemaster] Skriptdatum: 03/08/2007 20:08:37 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TestDeletemaster](
[id] [int] IDENTITY(1,1) NOT NULL,
[date] [datetime] NULL
) ON [PRIMARY]
Habe mit dieser schönen Managmentconsole dann ein paar Daten eingefügt.
Wenn ich dann nichts eingebe, dann steht da auch null.
Habe das auch mit C# Code probiert und das hat auch funktioniert.
Allerdings habe ich es über eine gebundene Source gemacht.
So sieht das bei mir aus mit dem Updatecommand. Achtung ist nicht schön, aber darum geht es ja auch nicht.
private void tsb_Click(object sender, EventArgs e)
{
SqlConnection sqlConnection = new SqlConnection("server=XXXXXX\\SQLEXPRESS;Trusted_Connection=yes;database=Test");
SqlCommand sqlCommand = new SqlCommand("UPDATE [TEST].[dbo].[TestDeletemaster] SET date=@date WHERE id=@id", sqlConnection);
sqlConnection.Open();
_adapter.UpdateCommand = sqlCommand;
_adapter.UpdateCommand.Parameters.Add("id", SqlDbType.Int, sizeof(Int32), "id");
_adapter.UpdateCommand.Parameters.Add("date", SqlDbType.DateTime, 8, "date");
DataTable dt = _bs.DataSource as DataTable;
try
{
_adapter.Update(dt.GetChanges());
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
sqlConnection.Close();
}
}
Die Daten werden über eine BindingSource in ein DataGridView geladen und dort bearbeitet und über einen Button wird der Updatecode aufgerufen.
Gruß falangkinjau
Hallo falangkinjau,
vielen Dank dafür, daß du dir die Mühe gemacht hast.
Aber es funktioniert immer noch nicht!
Wie ich oben schon gepostet habe:
Wenn ich "Ohne Variablen" arbeite, werden UPDATES durchgeführt egal ob ich:
UPADTE <tabelle> SET geburtsdatum = '' WHERE vrn = '1234567'; oder
UPDATE <tabelle> SET geburtsdatum = null WHERE vrn = '1234567';
schreibe. Also wenn ich den CODE hart reinschreibe wird er übernommen!
Sobald ich versuche eine Variable zu übergeben, kommt die Fehlermeldung?
string str_GeburtsDatum = txt_GeburtsDatum.Text;
DateTime _GeburtsDatum = Convert.ToDateTime(str_GeburtsDatum);
"Die Zeichenfolge wurde nicht als gültiges DateTime erkannt!"
Bin echt am verzweifeln, zumal bei mysql keine Probleme auftraten mit dem gleichen Programm
Wenn ich als GeburtsDatum lediglich die Variable string str_GeburtsDatum.Text übergebe, wird DB-Intern der 01.01.1900 reingeschrieben:
str_GeburtsDatum = txt_GeburtsDatum.Text
Update <tabelle> set geburtsdatum = @geburtsdatum where vrn = @vrn
cmd.Parameters.Add("@geburtsdatum", txt_GeburtsDatu.Text);
ist ja erstmal was, aber eigentlich soll null zurückgeschrieben werden!
Dafür müsste ich wieder den Variablen-Inhalt von str_GeburtsDatum in ein DateTime convertieren, wobei ich wieder am Ausgangspunkt meines Problems lande... Grrrrrrrrrrrr
Ich habe eine einfache Lösung gefunden:
private void GeburtsDatum_Aktualisieren()
{
string str_VRN = txt_VRN.Text;
string str_GeburtsDatum = txt_GeburtsDatum.Text;
if (txt_GeburtsDatum.Text == "")
{
SqlCommand cmd_GebUpdate = new SqlCommand();
cmd_GebUpdate.Connection = conn;
cmd_GebUpdate.Parameters.Add("@vrn", txt_VRN.Text);
txt_GeburtsDatum.Text);
cmd_GebUpdate.CommandText = "UPDATE <tabelle> SET geburtsdatum = null WHERE vrn = @vrn";
cmd_GebUpdate.ExecuteNonQuery();
}
else
{
SqlCommand cmd_GebUpdate = new SqlCommand();
cmd_GebUpdate.Connection = conn;
cmd_GebUpdate.Parameters.Add("@vrn", txt_VRN.Text);
cmd_GebUpdate.Parameters.Add("@GeburtsDatum", txt_GeburtsDatum.Text);
cmd_GebUpdate.CommandText = "UPDATE <tabelle> SET geburtsdatum = @GeburtsDatum WHERE vrn = @vrn";
cmd_GebUpdate.ExecuteNonQuery();
}
}
Bei dieser Variante wird keinerlei Typumwandlung vorgenommen, die mir in einigen Foren **immer als Stichwort **gegeben wurde.
Das Datum wird intern als DateTime in die Tabelle geschrieben
Wenn jemand eine "vernünftigere" Lösung hat, BITTE mitteilen.
Danke
Hallo Deletemaster,
private void tsb_Click(object sender, EventArgs e)
{
SqlConnection sqlConnection = new SqlConnection("server=XXXXXX\\SQLEXPRESS;Trusted_Connection=yes;database=Test");
SqlCommand sqlCommand = new SqlCommand("UPDATE [TEST].[dbo].[TestDeletemaster] SET date=@date WHERE id=@id", sqlConnection);
DateTime dt = DateTime.Now;
sqlCommand.Parameters.AddWithValue("id", 2);
//sqlCommand.Parameters.AddWithValue("date", dt);//Aktuelles Datum wird geschrieben
//sqlCommand.Parameters.AddWithValue("date", String.Empty);//1.1.1900 wird geschrieben
sqlCommand.Parameters.AddWithValue("date", DBNull.Value);// NULL wird geschrieben
try
{
sqlConnection.Open();
sqlCommand.ExecuteNonQuery();
}
catch(Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
finally
{
sqlConnection.Close();
}
}
Bei mir ist für Spalte date NULL erlaubt. Siehe Tabellenstruktur oben UND
wenn deine Spalte DateTime ist dann schreibe auch ein Datum und nicht String wie von FZelle schon gesagt.
Gruß falangkinjau
Du machst Immernoch eine Typumwandlung, nämlich von/nach String.
Diese passiert weil Du dem DateTime der Datenbank einen String übergibst.
private void GeburtsDatum_Aktualisieren()
{
string str_VRN = txt_VRN.Text;
DateTime Geburtstag;
SqlCommand cmd = new SqlCommand("UPDATE <tabelle> SET geburtsdatum = @GeburtsDatum WHERE vrn = @vrn", conn);
cmd.Parameters.Add("@vrn", txt_VRN.Text);
if( DateTime.TryParse(txt_GeburtsDatum.Text, out Geburtstag) )
cmd.Parameters.AddWithValue("@GeburtsDatum", Geburtstag);
else
cmd.Parameters.AddWithValue("@GeburtsDatum", DBNull.Value);
cmd.ExecuteNonQuery();
}
Ausserdem sehe ich nirgendwo ein conn.Open().
Du hällst doch nicht etwa gegen alle Regeln die Verbindung die ganze Zeit offen.
Hallo FZelle,
herzlichen Dank für Deine Antwort.
Deine gezeigte Vorgehensweise klappt.
Wie ich schon erwähnt hatte, habe ich immer Stichpunkte und Hinweise bekommen aber nirgends ein vergleichbares Beispiel gefunden.
Ich findes es toll, daß sich einige die Mühe machen und extra ein kleines Prgramm "basteln" um nachvollziehen zu können, warum manches nicht klappt.
Viele Funktionen die mit einem Designer generiert werden funktionieren einfach oder auch nicht.
Deshalb verwende ich gerade was Connections usw. betrifft keinen Designer, um die Funktionsweise besser zu verstehen und Fehler an den Richtigen Stellen zu finden.
PS: die conn.Open()
sieht bei mir so aus:
private void Aktualisieren()
{
conn.Open();
conn.Open();
cmd_Befehl.Execute.NonQuery();
conn.Close();
ausführe um die Verbindung nur sehr kurz offen zu halten.
Danke Dir vielmals
Gruß Frank
Ist nicht ganz richtig.
Die Connection sollte so lange offen gehalten werden wie für einen Vorgang
gerade nötig.
Gerade bei so zusammenhängenden Aktionen solltest Du auch TransActions benutzen.
Hallo zusammen,
es ist ja nun schon eine Weile her, daß ich dieses Problem hatte. In meinem letzten Projekt habe ich mit dem MSSQL Server gearbeitet.
Heute möchte ich eine kleine Web-Anwendung entwickeln die auf eine Access DB zugreift.
Wieder das Thema mit dem Datumswerten:
Beim Code:
private void MVL_Aktualisieren()
{
string str_vrn = txt_vrn.Text;
DateTime MVL;
OleDbCommand cmd = new OleDbCommand("UPDATE offen SET MVL = @MVL WHERE vrn = @vrn", conn);
cmd.Parameters.Add("@vrn", txt_vrn.Text);
if (DateTime.TryParse(txt_MVL.Text, out MVL))
cmd.Parameters.AddWithValue("@MVL", MVL);
else
cmd.Parameters.AddWithValue("@MVL", DBNull.Value);
cmd.ExecuteNonQuery();
}
bekomme ich folgende Fehlermeldungen:
'System.DateTime' enthält keine Definition für 'TryParse'
'System.Data.OleDb.OleDbParameterCollection' enthält keine Definition für 'AddWithValue'
Wie kommt diese Meldung zustande, was ist die Ursache dafür und wie kann ich sie beheben?
Danke für Eure Hilfe
Hallo,
Zu: 'System.DateTime' enthält keine Definition für 'TryParse'
Hast du das neue Projekt vielleicht auf einem anderen .NET Framework entwickelt? TryParse ist nämlich erst ab Version 2.0 verfügbar.
Gruß
Juy Juka
genau, das scheint es zu sein. Lade mir das 2.0er runter und versuche es erneut.
Danke erst mal...
Gruß Frank
Original von JuyJuka
Zu: 'System.DateTime' enthält keine Definition für 'TryParse'Hast du das neue Projekt vielleicht auf einem anderen .NET Framework entwickelt? TryParse ist nämlich erst ab Version 2.0 verfügbar.
Das Gleiche gilt für AddWithValue. Jürgen