Oracle查询在SQL+中工作,但在VB.NET中不返回任何行

Oracle查询在SQL+中工作,但在VB.NET中不返回任何行,vb.net,oracle,datetime,Vb.net,Oracle,Datetime,帮帮忙,有什么想法吗 我正在使用OLEDB适配器Oracle OLEDB和Oracle 10.2.0.3.0。我的代码为查询生成SQL,然后在OLEDBDataReader中执行时,HasRows为False。但是,如果我将查询字符串、复制和粘贴的内容输出到同一台客户机上以同一用户身份登录的SQL+,它将返回993行。什么给 以下是我的一段代码: Dim DB As New OleDb.OleDbConnection(String.Format("{0};Password={1}", Conne

帮帮忙,有什么想法吗

我正在使用OLEDB适配器Oracle OLEDB和Oracle 10.2.0.3.0。我的代码为查询生成SQL,然后在OLEDBDataReader中执行时,HasRows为False。但是,如果我将查询字符串、复制和粘贴的内容输出到同一台客户机上以同一用户身份登录的SQL+,它将返回993行。什么给

以下是我的一段代码:

Dim DB As New OleDb.OleDbConnection(String.Format("{0};Password={1}", ConnectionString, DBPassword))
Dim flowQuerySQL As String
'... code to generate query
Debug.Print(flowQuerySQL)
Dim flowQueryCMD As New OleDb.OleDbCommand(flowQuerySQL, DB)
Dim flowQuery As OleDb.OleDbDataReader = flowQueryCMD.ExecuteReader()
While flowQuery.HasRows
    '...handle rows
End While
debug.print语句显示:

SELECT CLASS_ID, OBJECT_ID FROM TDM_SF_PROCESS WHERE CLASS_ID=853 AND TDM_END_TIME >= '01-Jan-2009' AND TDM_END_TIME < '31-May-2009' AND TDM_STATUS <> 1 AND TDM_STATUS <> 2

我最近刚刚开始在VB.NET上与Oracle进行对抗,日期是暂时的

到目前为止,这种方法对我有效:

SELECT CLASS_ID, OBJECT_ID 
FROM TDM_SF_PROCESS 
WHERE CLASS_ID=853 
  AND TDM_END_TIME >= TO_DATE('01-Jan-2009', 'DD-Mon-YYYY') 
  AND TDM_END_TIME < TO_DATE('31-May-2009', 'DD-Mon-YYYY') 
  AND TDM_STATUS <> 1 
  AND TDM_STATUS <> 2 
在我使用TO_DATE函数之前,它不会工作。希望这对你也有用


我是一个MS-SQL的家伙,所以我还没能研究出为什么这会起作用。启蒙运动,有人吗?

我最近刚开始用VB.NET对付Oracle,日期是暂时的

到目前为止,这种方法对我有效:

SELECT CLASS_ID, OBJECT_ID 
FROM TDM_SF_PROCESS 
WHERE CLASS_ID=853 
  AND TDM_END_TIME >= TO_DATE('01-Jan-2009', 'DD-Mon-YYYY') 
  AND TDM_END_TIME < TO_DATE('31-May-2009', 'DD-Mon-YYYY') 
  AND TDM_STATUS <> 1 
  AND TDM_STATUS <> 2 
在我使用TO_DATE函数之前,它不会工作。希望这对你也有用


我是一个MS-SQL的家伙,所以我还没能研究出为什么这会起作用。启示,有人吗?

1您正在构建一个不使用绑定变量的查询吗?或者您是否在调试输出中为我们手动填充绑定变量?如果不使用绑定变量,实际上会在数据库中造成巨大的性能问题,因为这会破坏Oracle的共享池。您将创建易受SQL注入攻击的不安全代码。最后,您将花费大量时间处理与数据类型、转义字符串等相关的问题

如果使用绑定变量,只需在VB.Net应用程序中创建本地日期变量,并将它们绑定到查询中,所有操作都会正常工作。这将更加有效,因为Oracle只需要对语句进行一次硬解析,并且在您使用不同的日期反复运行查询时,不会用类似的语句淹没共享池

我不是一个VB开发人员。但是如果您使用的是绑定变量,那么您将用占位符替换SQL语句中的文本,即

AND TDM_END_TIME >= :early_time 
AND TDM_END_TIME <  :late_time 
AND TDM_STATUS <> :status_1 
AND TDM_STATUS <> :status_2
第二个选项是使用to_DATE函数自己进行显式转换


1是否正在生成不使用绑定变量的查询?或者您是否在调试输出中为我们手动填充绑定变量?如果不使用绑定变量,实际上会在数据库中造成巨大的性能问题,因为这会破坏Oracle的共享池。您将创建易受SQL注入攻击的不安全代码。最后,您将花费大量时间处理与数据类型、转义字符串等相关的问题

如果使用绑定变量,只需在VB.Net应用程序中创建本地日期变量,并将它们绑定到查询中,所有操作都会正常工作。这将更加有效,因为Oracle只需要对语句进行一次硬解析,并且在您使用不同的日期反复运行查询时,不会用类似的语句淹没共享池

我不是一个VB开发人员。但是如果您使用的是绑定变量,那么您将用占位符替换SQL语句中的文本,即

AND TDM_END_TIME >= :early_time 
AND TDM_END_TIME <  :late_time 
AND TDM_STATUS <> :status_1 
AND TDM_STATUS <> :status_2
第二个选项是使用to_DATE函数自己进行显式转换


只有一个结果吗?您正在使用的而现在HasRows为false?请注意,执行命令后的下一条语句是While flowQuery.HasRows。但是,我刚刚尝试从查询中删除日期,现在HasRows是真的。为什么呢?OleDb是否要求日期的格式与Oracle要求的格式不同?我试过日期和时间,但那给了我ORA-01861。只有一个结果吗?您正在使用的而现在HasRows为false?请注意,执行命令后的下一条语句是While flowQuery.HasRows。但是,我刚刚尝试从查询中删除日期,现在HasRows是真的。为什么呢?OleDb是否要求日期的格式与Oracle要求的格式不同?我试过日期和时间,但那给了我ORA-01861.+1 duh,在检查了我的一些旧代码后,我也用它来约会。出于某种原因,字符串不能正确解析,除非它们是Oracle系统格式。事实上,我用的是:到2011年10月24日,甚至是作为一个自动热键。该死的,我还以为会这样呢!下面是它执行的SQL:从TDM_SF_进程中选择CLASS_ID、OBJECT_ID、TDM_END_TIME,其中CLASS_ID=862和TDM_END_TIME>=截止日期为2009年1月1日、DD Mon YYYY和TDM_END_TIME<截止日期为2009年5月31日、DD Mon yyyyyy和TDM_状态1和TDM_状态2仍然有行=false忽略这一点!类ID 862没有行。看起来像是
他叫道。谢谢很高兴它起作用了。我还更新了4位数年份的示例。后来我意识到,我把我的示例从一个具体要求2位数年份的实现中提了出来!。据我所知,这是一个OLEDB/ODBC约定,实际的OLEDB驱动程序不会转换为日期,除非它在2009年5月31日之内。因此,驱动程序告诉数据库它是字符而不是日期。+1 duh,在查看了我的一些旧代码后,我也在使用TO_date。出于某种原因,字符串不能正确解析,除非它们是Oracle系统格式。事实上,我用的是:到2011年10月24日,甚至是作为一个自动热键。该死的,我还以为会这样呢!下面是它执行的SQL:从TDM_SF_进程中选择CLASS_ID、OBJECT_ID、TDM_END_TIME,其中CLASS_ID=862和TDM_END_TIME>=截止日期为2009年1月1日、DD Mon YYYY和TDM_END_TIME<截止日期为2009年5月31日、DD Mon yyyyyy和TDM_状态1和TDM_状态2仍然有行=false忽略这一点!类ID 862没有行。853,看起来它起作用了。谢谢很高兴它起作用了。我还更新了4位数年份的示例。后来我意识到,我把我的示例从一个具体要求2位数年份的实现中提了出来!。据我所知,这是一个OLEDB/ODBC约定,实际的OLEDB驱动程序不会转换为日期,除非它在2009年5月31日之内。因此,驱动程序告诉数据库它是字符而不是日期。细节为+1。对于Oracle及其术语来说是新的:您能发布一个带有绑定变量的示例吗?请+1了解详细信息。对于Oracle及其术语来说是新手:您能发布一个带有绑定变量的示例吗?
AND tdm_end_time >= to_date( '01-Jan-2009', 'DD-MON-YYYY' )
AND tdm_end_time <  to_date( '31-May-2009', 'DD-MON-YYYY' )