Gewusst wie: einfügen von Datum in einer relationalen Oracle-Datenbank mit C#
Habe ich Var Datum in Oracle, und ich versuche, einfügen von Daten aus meinem C# - Programm
sql = "insert into Table(MyDate) values (" + convert.todatetime(txt) + ")";
Bekomme ich eine Fehlermeldung, was kann ich tun ?
- Bitte auch den text posten der tatsächliche Fehler, sonst ist es Recht schwer, Ihnen zu helfen.
- Was ist der Fehler???
- Was ist die Fehlermeldung, die Sie bekommen?
- 1. Welche Fehler haben Sie? 2. Was ist der Wert txt aus. 3. Warum sind Sie konvertieren den string txt, um ein DateTime-nur um Sie zu konvertieren zurück zu einem string wieder? 4. Das Standard-format für ein DateTime-ist wahrscheinlich nicht das richtige format für Oracle zu analysieren, müssen Sie möglicherweise verwenden .ToString() auf die DateTime -, um es in das richtige format.
Du musst angemeldet sein, um einen Kommentar abzugeben.
OracleType
sollOracleDbType
, und ich denke.DateTime
soll.Date
. Ich habe nichtOracleType.DateTime
in meinem intellisense mit dem Oracle 12c DLL-ODP für .NET, client assembly Oracle.ManagedDataAccess.dll version 4.121.2.:
auf den Namen desOracleParameter
, wenn Sie es hinzufügen. Die OP wurde auch versucht, ein genaues Datum (txt
), nicht DateTime.Nun. Dies macht die Frage nicht beantworten.Parameter verwenden. Es wird Ihr problem lösen und verhindern, dass die Injektion.
Oracle erwartet, dass es zu einem tatsächlichen date-Wert, nicht nur eine Zeichenfolge, die aussieht wie ein Datum. Verwenden Sie die
TO_DATE()
Funktion zu erklären, wie Ihr string wird formatiert, so etwas wie dieses:Versuchen Sie es mit DateTime.TryParse(text) oder DateTime.Parse(text)
DateTime myDate = DateTime.Parse("1/1/1900");
und gesendet, die in ein OracleParameter:OraCommand.Parameters.Add("@"+fieldName, OracleDbType.Date).Value = myDate;
- erhieltORA-01840: input value not long enough for date format\nORA-06512: at line 1
. Etwas mehr erforderlich ist als nur das.DateTime.Parse("1/1/1900");
war in Ordnung, und so war meinOracleParameter
. Ich würde löschen Sie meine vorherigen Kommentar, aber dies könnte tatsächlich jemand helfen: mein Problem war eigentlich, denn ich hatte meine Parameter in meine gespeicherte Prozedur aus, um von dem, was ich geschickt wurde, in mein C#, was ich so gedacht hatte, um mein Feld "Datum" war wirklich aufgenommen wird, in einem anderen input-parameter in meinem gespeicherte Prozedur, und legen Sie zu einem anderen Feld. Mein Feld "Datum" war immer nur eine leere Zeichenfolge von einem anderen input-parameter ist der Wert, anstatt das geparste Datum. Moral: Bestellung prüfen.Bitte binden Sie Ihre Variablen (wie ocdecio erzählt) ! Nicht nur, dass es sql-injection verhindern, es ist auch viel schneller. Vor allem in einer multi Parallelität situation. Lesen Sie zum Beispiel hier: http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28844/building_odp.htm#CEGCGDAB .
"Bind-Variablen sind Platzhalter, die innerhalb einer SQL-Anweisung. Wenn eine Datenbank erhält eine SQL-Anweisung, es bestimmt, ob die Anweisung bereits ausgeführt wurde und im Speicher abgelegt. Falls die Anweisung nicht existiert, in der Erinnerung, Oracle-Datenbank, können Sie es wiederverwenden, und überspringen Sie die Aufgabe der Analyse und Optimierung der Anweisung. Verwendung von bind-Variablen macht die Aussage wiederverwendbar mit verschiedenen Eingabewerten. Verwendung von bind-Variablen verbessert auch die Leistung von Abfragen in der Datenbank, eliminiert die Notwendigkeit für die spezielle Handhabung von literalen Anführungszeichen in der Eingabe, und schützt vor SQL-injection-Angriffe."
Ich weiß, das war eine schlecht gestellte Frage, aber ich sah einige schlechte Antworten, wenn ich hatte die gleiche Frage und lief in dieser. Dies ist, wie ich es gelöst, und ich Antworte mit dem OP-Kontext:
Analysieren Sie das Datum in einem
DateTime
variable:Dann Parametrisierung der Abfrage:
Einrichten eines
OracleParameter
:Vorausgesetzt, Sie haben bereits ein
OracleConnection
alsconnection
richten Sie Ihren Befehl aus und fügen Sie Ihre parameter:Ausführen:
Tun NICHT verschwenden Sie Ihre Zeit auf einer der
TO_DATE
Unsinn. Dies ist für, wenn Sie hinzufügen, etwas mit SQL*Plus oder Oracle SQL Developer direkt, oder VIELLEICHT, wo Sie zu senden in eine STRING-variable, die den Wert (nicht ein DateTime-variable) in der GENAUE format, dasTO_DATE
erwartet und weisen Sie in dieTO_DATE
konstruieren innerhalb Ihrer Abfrage oder eine gespeicherte Prozedur (d.h.to_date('2013-05-13 12:13:14', 'YYYY-MM-DD HH24:MI:SS')
. Mit einemDateTime
Variablen und zuweisen, der auf einOracleParameter
mit einemOracleDbType
vonOracleDbType.Date
, vorausgesetzt, Sie haben eineDATE
Feld in der Tabelle und analysieren könnentxt
in eineDateTime
variabel, jedoch, ist die beste und einfachste.Einfachste Art und Weise möglich: