1

我正在尝试从 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 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。如果我通过函数执行器更改日期值的字节以使日期看起来无效,我能够得到“行中的错误”类型的消息。曾经有几个程序可以修复无效日期,但我认为有一个被取消了。另一个是 Goldstar Software 的 FixDates,但它不是免费的。

于 2013-09-16T11:51:22.273 回答