Oracle に Date Var があり、C# プログラムからデータを挿入しようとしています
sql = "insert into Table(MyDate) values (" + convert.todatetime(txt) + ")";
エラーが発生しました。どうすればよいですか?
cmd.CommandText = "INSERT INTO Table (myDate)VALUES(:dateParam)";
cmd.Parameters.Add(new OracleParameter("dateParam", OracleDbType.Date))
.Value = DateTime.Now;
cmd.ExecuteNonQuery();
パラメータを使用します。あなたの問題を解決し、注射を防ぎます。
Oracle は、日付のように見える単なる文字列ではなく、実際の日付値であると想定しています。次のように、関数を使用してTO_DATE()
、文字列がどのようにフォーマットされているかを説明する必要があります。
INSERT INTO Table (myDate)
VALUES(TO_DATE('2009-03-30 12:30:00', 'YYYY-MM-DD HH:mi:ss'));
DateTime.TryParse(text) または DateTime.Parse(text) を使用してみてください
これはよくない質問であることは知っていますが、同じ質問をしてこれに遭遇したときに、いくつかの悪い答えを見ました. これが私がそれを解決した方法であり、OPのコンテキストを使用して答えます:
DateTime
日付を変数に解析します。
DateTime myDate = DateTime.Parse(txt);
次に、クエリをパラメーター化します。
sql = "insert into Table(MyDate) values (:myDate)";
をセットアップしますOracleParameter
。
OracleParameter param = new OracleParameter();
param.ParameterName = "myDate";
param.OracleDbType = OracleDbType.Date;
param.Value = myDate;
OracleConnection
asが既にあると仮定connection
して、コマンドを設定し、パラメータを追加します。
OracleCommand cmd = new OracleCommand(sql, connection);
cmd.Parameters.Add(param);
実行する:
cmd.ExecuteNonQuery();
ナンセンスなことに時間を無駄にしないでください。TO_DATE
これは、SQL*Plus または Oracle SQL Developer を直接使用して何かを追加する場合、または STRING 変数の値 (DateTime 変数ではない) を EXACT 形式で送信するTO_DATE
場合に使用しTO_DATE
ます。クエリまたはストアド プロシージャ (つまり、テーブルにフィールドがあり、変数に解析できると仮定して、変数をto_date('2013-05-13 12:13:14', 'YYYY-MM-DD HH24:MI:SS')
使用し、それをofにDateTime
割り当てるのが最善かつ最も簡単です。 OracleParameter
OracleDbType
OracleDbType.Date
DATE
txt
DateTime
変数をバインドしてください (ocdecio のように) ! SQL インジェクションを防ぐだけでなく、はるかに高速です。特に複数の同時実行状況では。たとえば、http: //download.oracle.com/docs/cd/B28359_01/appdev.111/b28844/building_odp.htm#CEGCGDABを参照してください。
「バインド変数は、SQL文内のプレースホルダです。データベースがSQL文を受け取ると、文がすでに実行されてメモリーに格納されているかどうかが判断されます。文がメモリーに存在する場合、Oracle Databaseはそれを再利用して、次のタスクをスキップできます。ステートメントの解析と最適化.バインド変数を使用すると、異なる入力値でステートメントを再利用できます.バインド変数を使用すると、データベースでのクエリのパフォーマンスも向上し、入力内のリテラル引用符を特別に処理する必要がなくなり、SQL インジェクション攻撃から保護されます. "