2

Oracle Date フィールドに maxdate を挿入すると、次のようになります。

using (OracleCommand Cmd = new OracleCommand("insert into test (mydate) values (:mydate)", OracleConnection))
{
    Cmd.Parameters.Add(new OracleParameter(":mydate", DateTime.MaxValue));
    Cmd.ExecuteNonQuery();
}

そして、値を取得してみてください:

using (OracleCommand Cmd = new OracleCommand("select mydate from test where mydate=:mydate", OracleConnection))
{
    Cmd.Parameters.Add(new OracleParameter(":mydate", DateTime.MaxValue));
    object MyDate = Cmd.ExecuteScalar();
}

MyDate オブジェクトは null のままです。つまり、レコードを読み戻すことはできません。これはバグですか?どこか丸めの不一致?

4

2 に答える 2

1

DateTime.MaxValueC# から oracle にパラメーターを渡す場合timestamp、値は次のようになります。10000/01/01/ 00:00:00 年: 10000(はい、1 万、タイプミスではありません)。これは、c# と oracle OLEDB プロバイダーの間のバグだと思います

ほとんどの場合、挿入時に例外が発生し、挿入が失敗します。年の値を確認するには、次の式を使用します。 EXTRACT (YEAR FROM CAST(yourparameter AS DATE))

幸運を!

于 2013-03-19T20:34:11.453 に答える
1

これはDate、データベースの が とは異なるためDateTime.MaxValueです。
同じデータ型でも同じ精度でもありません。

このクエリを試してください:

OracleCommand Cmd = new OracleCommand("select dump(mydate), dump(:mydate) from test where rownum=1", OracleConnection)

結果は次のようになります。

dump(mydate):  Typ=12 Len=7: 199,199,12,31,24,60,60
dump(:mydate): Typ=180 Len=11: 199,199,12,31,24,60,60,59,154,201,156

これは、DB 内の値が型であり、秒の時間を含むがミリ秒を含まないことを意味しますが、パラメーターはミリ秒を保持するデータ型にDate変換されます。timestamp

したがって、それを使用したい場合は、次のwhere clauseように試してください。

using (OracleCommand Cmd = new OracleCommand("select mydate from test where trunc(mydate, 'mi') = trunc(:mydate, 'mi')", OracleConnection))
         {
             Cmd.Parameters.Add(new OracleParameter(":mydate", DateTime.MaxValue));
             object MyDate = Cmd.ExecuteScalar();
         } 

これにより、秒も切り捨てられることに注意してください

于 2012-06-20T13:42:41.043 に答える