Autor |
Beitrag |
hui1991
      
Beiträge: 433
Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
|
Verfasst: 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:
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); int result = _cmd.ExecuteNonQuery(); |
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
      
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
|
Verfasst: 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:
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:
C#-Quelltext 1:
| _cmd.Parameters.Add("@Datum", OleDbType.DBTimeStamp).Value = DateTime.Now; |
Gruß Jürgen
|
|
hui1991 
      
Beiträge: 433
Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
|
Verfasst: 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
      
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
|
Verfasst: 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 
      
Beiträge: 433
Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
|
Verfasst: 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():
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& executeResult) bei System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) bei System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& 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
      
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
|
Verfasst: Mo 26.01.09 17:11
hui1991 hat folgendes geschrieben : | 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 
      
Beiträge: 433
Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
|
Verfasst: Mo 26.01.09 17:29
hui1991 hat folgendes geschrieben : | 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 
      
Beiträge: 433
Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
|
Verfasst: 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.
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 
|
|
|