Autor Beitrag
hui1991
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 433

Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
BeitragVerfasst: Mo 26.01.09 13:04 
Hallo,

ich hab jetzt 2 Stunden nach meinem Problem gegoogelt, aber keine Lösung gefunden.

Ich habe eine Access-Tabelle, in der ist ein ID:Autowert, Name:Text, Datum:DateTime.
Mein Code sieht so aus:
ausblenden C#-Quelltext
1:
2:
3:
4:
OleDbCommand _cmd = new OleDbCommand("INSERT INTO Protokoll ( Name, Datum) VALUES (@Name, @Datum) ", m_oleDbConnection);
_cmd.Parameters.AddWithValue("@Name","Name1");
_cmd.Parameters.AddWithValue("@Datum",DateTime.Now); //DateTime.Now ist nur ein Beispiel, weil man eigentlich das Datum aus einem DateTimePicker auswählt
int result = _cmd.ExecuteNonQuery(); //Datentypen in Kriterienausdruck unverträglich.


Ich brauche in der Tabelle Datum und Uhrzeit.

In vielen Foren habe ich gelesen man soll Parameter übergeben und dann ist alles in Ordnung.
Irgendwie klappt das mit den Parameter nicht.

Hatte das Problem vor 2 Monaten schon einmal, das Problem konnte ich nicht lösen.
Blos jetzt brauch ich das als Vergleichbarer Wert, da will ich nicht auf ein Integer ausweichen.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mo 26.01.09 13:29 
SDK-Doku/MSDN hat folgendes geschrieben:
OleDbParameter-Klasse
Anstelle benannter Parameter verwendet der OLE DB-.NET Framework-Datenanbieter mit einem Fragezeichen (?) markierte Positionsparameter.

Es muss also so lauten:
ausblenden C#-Quelltext
1:
2:
OleDbCommand _cmd = new OleDbCommand("INSERT INTO Protokoll ( Name, Datum) 
   VALUES (?, ?) "
, m_oleDbConnection);

Wenn der Fehler bleibt, dann mache es etwas ausführlicher so, um genau den gewünschten Access-Datentyp festzulegen:
ausblenden C#-Quelltext
1:
_cmd.Parameters.Add("@Datum", OleDbType.DBTimeStamp).Value = DateTime.Now;					


Gruß Jürgen
hui1991 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 433

Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
BeitragVerfasst: Mo 26.01.09 16:20 
Hallo,

also ich hab jetzt die Änderungen übernommen. Im Screenshot sieht man jetzt das Ergebnis.
Es bleibt bei der selben Fehlermeldung.
Würde gerne Wissen warum der das DateTime nicht nimmt.
Einloggen, um Attachments anzusehen!
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mo 26.01.09 16:44 
Nun, Du hast 5 Parameter. Bist Du sicher, dass DateTime das Problem verursacht? Die Parameter müssen unbedingt in der richtigen Reihenfolge zugewiesen werden. Pack das ExecuteNonQuery doch in ein try-catch und lass ex.ToString() anzeigen - das liefert die meisten Informationen.

Jürgen
hui1991 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 433

Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
BeitragVerfasst: Mo 26.01.09 16:59 
Bin mir 100% sicher, da Datum früher mal ein String war und nichts vertauscht wurde.
Jetzt hab ich es zu DateTime geändert und der Fehler kommt.
Ergebnis von ex.ToString():
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
Eine Ausnahme (erste Chance) des Typs "System.Data.OleDb.OleDbException" ist in System.Data.dll aufgetreten.
"Kundenverwaltung.vshost.exe" (Verwaltet): "C:\WINDOWS\assembly\GAC_MSIL\System.Transactions.resources\2.0.0.0_de_b77a5c561934e089\System.Transactions.resources.dll" geladen, keine Symbole geladen.
System.Transactions Critical: 0 : <TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Critical"><TraceIdentifier>http://msdn.microsoft.com/TraceCodes/System/ActivityTracing/2004/07/Reliability/Exception/Unhandled</TraceIdentifier><Description>Unbehandelte Ausnahme</Description><AppDomain>Kundenverwaltung.vshost.exe</AppDomain><Exception><ExceptionType>System.Data.OleDb.OleDbException, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType><Message>Datentypen in Kriterienausdruck unverträglich.</Message><StackTrace>   bei System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object&amp; executeResult)
   bei System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object&amp; executeResult)
   bei System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object&amp; executeResult)
   bei System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
   bei System.Data.OleDb.OleDbCommand.ExecuteNonQuery()


DateTime muss ich nicht irgendwie Convertieren oder?
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mo 26.01.09 17:11 
user profile iconhui1991 hat folgendes geschrieben Zum zitierten Posting springen:
Bin mir 100% sicher, da Datum früher mal ein String war und nichts vertauscht wurde.
Jetzt hab ich es zu DateTime geändert und der Fehler kommt.

DateTime muss ich nicht irgendwie Convertieren oder?

Autsch. Der Parameter-Typ und der Typ in der DB müssen natürlich passen. Ein Datum als String speichern, igittigitt. Und ich hatte gehofft, dass die Exception sich konkreter zu einem einzelnen Parameter äußert.

Wie sieht es jetzt konkret aus? Typ in der Datenbank als String oder Date oder DBDate oder DBTimeStamp?

DateTime soll nicht konvertiert werden; das ist ein Sinn der Parameter, dass der DbProvider das eigenständig steuert.

Jürgen
hui1991 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 433

Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
BeitragVerfasst: Mo 26.01.09 17:29 
user profile iconhui1991 hat folgendes geschrieben Zum zitierten Posting springen:
da Datum früher mal ein String


Jetzt ist Datum ein 'Datum/Uhrzeit' Feld in der Access-Datenbank.
Die Variable die ich Versuche da rein zu bekommen ist ein DateTime.
Die Tabelle ist, aber Leer, weil ich keine Einträge reinbekomme ^^

Das Feld und die Variable sollten eigentlich zusammen passen. (nichts ähnlich wie String oder Integer, oder sonst was).

Wenn ich den Typ abfrage von einem gelesenen 'Datum/Uhrzeit' steht bei mir System.Datetime da.
hui1991 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 433

Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
BeitragVerfasst: Di 27.01.09 09:50 
Hi,

ich markiere es mal als erledigt.

Kann es sein das DateTime/Uhrzeit, dass dieses '/' ein oder heißen soll.
Weil wenn ich nur Datum oder Zeit einfüge, funktioniert es problemlos. :)
ausblenden C#-Quelltext
1:
2:
_cmd.Parameters.Add("@Datum", OleDbType.DBDate).Value = DateTime.Now.Date;
_cmd.Parameters.Add("@Uhrzeit", OleDbType.DBTime).Value = DateTime.Now.TimeOfDay;


Ich hätte es lieber alles in einem Feld, aber anscheinend funktioniert das nicht :(

Danke Jürgen für deine Hilfe, wäre auf das ohne dich nicht draufgekommen :)