我正在尝试从 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".