1

(私が作成した C# コンソール アプリを使用して) Pervasive データベースからデータを読み込もうとしていますが、特定の日付列に関する情報を含む行に到達するたびに、プログラムは例外をスローします。

問題のあるレコードを特定できました。

DtTransDate        DtSystemTime           DtnLotteryDrawDate
7/15/2013          3:01:32 AM             9/1/8226

ご覧のとおり、DtnLotteryDrawDate は奇妙な値ですが、有効な日付なので読み取ることができるはずです。Pervasive 用の ADO.NET Provider を使用しています (ちなみに、これは Pervasive ドライバー自体にバグがあることを示しています)。

at Pervasive.Data.SqlClient.Lna.e.ak(u )
at Pervasive.Data.SqlClient.Lna.w.a(Int16 , Int32 , ad , f )
at Pervasive.Data.SqlClient.Lna.e.aa(Int32 , Boolean )
at Pervasive.Data.SqlClient.PsqlDataReader.e()
at Pervasive.Data.SqlClient.PsqlDataReader.Read()

そこで、ODBC ドライバーを試してみましたが、同じ問題が発生しましたが、メッセージが少し改善されました。

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, Int32 millisecond)
   at Pervasive.Data.SqlClient.Lna.u.r()
   at Pervasive.Data.SqlClient.Lna.aq.a(u )
   at Pervasive.Data.SqlClient.Lna.e.ak(u )
   at Pervasive.Data.SqlClient.Lna.w.a(Int16 , Int32 , ad , f )
   at Pervasive.Data.SqlClient.Lna.e.aa(Int32 , Boolean )
   at Pervasive.Data.SqlClient.PsqlDataReader.e()
   at Pervasive.Data.SqlClient.PsqlDataReader.Read()

そこで、日付を文字列に変換して問題が解決するかどうかを確認しようとしましたが、うまくいきませんでした。基本的に、次の SQL ステートメントを作成しました。

 SELECT DtTransDate ,
        TmSystemTime ,
        CONVERT(DtnLotteryDrawDate, SQL_CHAR) as DtnLotteryDrawDate
        FROM    TICKHISH
        WHERE   ( DtTransDate >= { d '2013-07-15' }

上記の SQL ステートメントは、次の例外をスローします。

error in row上に貼り付けたスタックトレース。

フィールドを文字列に変換しようとしない場合は、例外がより役立ちます。

Year, Month, and Day parameters describe an un-representable DateTime.

したがって、基本的に、ADO.NET ドライバーは、月または日のいずれかの誤った値を渡す Date を作成しようとしています。おそらく8226、日または月のフィールドのいずれかとして渡されます。

Pervasive Control Panel (PCC) で同じ SQL ステートメントを実行してみましたが、興味深いことに、日付フィールドを文字列に変換しようとしなくても PCC プログラムはクラッシュしませんが、何らかの変換を試みたり、次のような関数を呼び出したりすると、year(DtnLotteryDrawDate)同様にすぐにクラッシュします。

この問題を回避する方法についてのアイデアはありますか?

小さなアップデート

SSMS を使用してリンク サーバーをセットアップし、リンク サーバーを介して Pervasive データベースに接続することができました。この単純なクエリを実行しようとすると:

SELECT  * FROM OPENQUERY(linked_server, 'SELECT * FROM MyTable where DtTransDate  = ''2013-07-15'' ')

次のエラーが表示されます。

OLE DB provider "MSDASQL" for linked server "linked_server" returned message "[Pervasive][ODBC Client Interface]Data truncated column 186.".
OLE DB provider "MSDASQL" for linked server "linked_server" returned message "[Pervasive][ODBC Client Interface]Invalid date, time or timestamp value.".
Msg 7330, Level 16, State 2, Line 3
Cannot fetch a row from OLE DB provider "MSDASQL" for linked server "linked_server".
4

1 に答える 1

1

実際のデータに問題があるようです。PCC を介して挿入し、PCC と ADO.NET プロバイダーの両方を介して 9/1/8226 のデータ値を表示することができました。Function Executor を使用して日付値のバイトを変更して、日付が無効に見えるようにすると、「行のエラー」タイプのメッセージを受け取ることができました。以前は無効な日付を修正できるプログラムがいくつかありましたが、そのうちの 1 つが削除されたと思います。もう 1 つは Goldstar Software の FixDates ですが、無料ではありません。

于 2013-09-16T11:51:22.273 に答える