ODBC データ ソースがあり、列の 1 つは DateTime です。IsDbNull
フィールド ( 、GetValue
、 )で何かをしようとするとGetValues
、値がこのデータベースの null に相当する場合、例外が発生します。
System.ArgumentOutOfRangeException occurred
HResult=-2146233086
Message=Year, Month, and Day parameters describe an un-representable DateTime.
Source=mscorlib
StackTrace:
at System.DateTime.DateToTicks(Int32 year, Int32 month, Int32 day)
at System.DateTime..ctor(Int32 year, Int32 month, Int32 day, Int32 hour, Int32 minute, Int32 second)
at System.Data.ProviderBase.DbBuffer.ReadDateTime(Int32 offset)
at System.Data.Odbc.CNativeBuffer.MarshalToManaged(Int32 offset, SQL_C sqlctype, Int32 cb)
at System.Data.Odbc.OdbcDataReader.internalGetDateTime(Int32 i)
at System.Data.Odbc.OdbcDataReader.GetValue(Int32 i, TypeMap typemap)
at System.Data.Odbc.OdbcDataReader.GetValue(Int32 i)
at System.Data.Odbc.OdbcDataReader.IsDBNull(Int32 i)
at Sandbox_Form.Form1.button1_Click(Object sender, EventArgs e) in e:\Code\Sandbox Form\Form1.cs:line 49
InnerException:
クエリを に変更すると、結果としてselect cast(First_Visit as varchar) as First_Visit_cast from Clients
テキスト文字列0/0/0 12:00:00
が返されます。
これが私のテストコードのスニペットです。最初の 17 行は正常に機能しますが、18 行には「null」の値の日付があり、表示された例外がスローされます。
const string Query = @"select cast(First_Visit as varchar) as First_Visit_cast
,First_Visit
from Clients";
private void button1_Click(object sender, EventArgs e)
{
using (var con = new OdbcConnection("Dsn=My_ODBC_DSN"))
{
con.Open();
using (var cmd = new OdbcCommand(Query, con))
using (var rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
var test = rdr.GetValue(0); //returns "0/0/0 12:00:00" as string.
var test3 = rdr.IsDBNull(1); //Throws an ArgumentOutOfRangeException: "Year, Month, and Day parameters describe an un-representable DateTime."
var test2 = rdr.GetValue(1); //Throws an ArgumentOutOfRangeException: "Year, Month, and Day parameters describe an un-representable DateTime."
var records = new object[rdr.FieldCount];
rdr.GetValues(records); //Throws an ArgumentOutOfRangeException: "Year, Month, and Day parameters describe an un-representable DateTime."
}
}
}
}
これを回避する方法はありますか? Select * from TableName
すべての DateTimes を識別して明示的に文字列としてキャストするのではなく、クエリを as として書きたいだけです。