从Pervasive数据库中读取Date字段会导致崩溃

时间:2013-09-14 19:36:59

标签: ado.net pervasive pervasive-sql

我正在尝试从Pervasive数据库中读取一些数据(通过我编写的C#控制台应用程序),每当我到达包含特定日期列信息的行时,程序都会抛出异常。

我设法识别出有问题的记录:

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

正如您所看到的,DtnLotteryDrawDate是一个奇怪的值,但我应该能够读取它,因为它是一个有效的日期。我正在使用ADO.NET Provider for Pervasive(顺便提一下,它表明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()

所以我尝试将Date转换为字符串以查看是否可以解决问题,但这不起作用。基本上,我写了以下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控制面板(PCC)上运行相同的SQL语句,有趣的是,如果我不尝试转换为字符串日期字段但是如果我尝试任何类型的转换,则PCC程序不会崩溃或调用类似year(DtnLotteryDrawDate)的函数也会立即崩溃。

有关如何解决此问题的任何想法?

TINY UPDATE

我能够使用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".

1 个答案:

答案 0 :(得分:0)

实际数据似乎有问题。我能够通过PCC插入,并通过PCC和ADO.NET提供者查看数据值9/1/8226。如果我通过Function Executor更改了日期值的字节以使日期显示无效,我就能得到“行中错误”类型的消息。曾经有几个程序可以修复无效的日期,但我认为有一个被拉了。另一个是来自Goldstar Software的FixDates,但它不是免费的。