OraOLEDB.Oracle提供程序返回错误的结果

时间:2013-11-15 21:51:45

标签: vb.net oracle oraoledb

这对你来说很奇怪。我正在对一个看起来像这样的表运行一个简单的查询:

select expiration_date from Tbl where expiration_date > sysdate - 1

在SQL Developer中,这将返回35行。使用OraOLEDB.Oracle提供程序调用完全相同的SQL语句的VB.NET应用程序仅返回30行。

这是我的连接字符串(为易读性而分解):

Provider=OraOLEDB.Oracle;
Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)
(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=xe)));
User Id=rps;
Password=*******;
OLEDB.NET=True;

这是示例代码(我们在通用ASHX处理程序的ProcessRequest部分中):

Dim conn As OleDbConnection = New OleDbConnection(ConfigurationManager.AppSettings("ConnectionString"))
conn.Open()
Dim cmd As OleDbCommand = conn.CreateCommand()
Dim sql As String = "select expiration_date from Tbl where expiration_date > sysdate - 1"
cmd.CommandText = sql
Dim reader As OleDbDataReader = cmd.ExecuteReader()
context.Response.ContentType = "text/plain"
context.Response.Write("RESULTS: " & vbCrLf)
Dim i As Int32 = 1
While reader.Read()
    context.Response.Write(i.ToString() & ". " & reader.GetValue(0).ToString() & vbCrLf)
    i = i + 1
End While

reader.Close()
cmd.Dispose()
conn.Close()
conn.Dispose()

如果我将查询更改为说... where expiration_date < sysdate + 15,那么它可以正常工作。

到底是怎么回事?如果有帮助,这是ODAC 11.2.0.3。


更新1:我删除了ODAC 11.2.0.3并升级到ODAC 12.1.0.1(ORAOLEDB12.DLL)。行为不变。


更新2:这很有趣。我切换到ODP.NET只是为了看看会发生什么。你猜怎么着?同样的结果。我甚至不能责怪提供者了。我需要喝一杯。


更新3:最后有个明智的想法,看看哪些日期被排除在外。在今天之后的11月份,有五个expiration_dates应该包含在结果中。那些正是那些被排除在外的人。所以当从C#调用时,sysdate-1没有做你期望的事情。是时候再喝一杯了。

1 个答案:

答案 0 :(得分:1)

我是个白痴。 Oracle SQL Developer在事务中运行所有内容,而我并没有COMMIT任何事情。我垂头丧气,只能希望这会成为别人的警告。