查询的问题 - 当查询在SQL导航运行返回行,但不是在我的C#程序

问题描述:

enter image description here查询的问题 - 当查询在SQL导航运行返回行,但不是在我的C#程序

更新:

这是调试器,这是从一个字符串生成器中检索查询:

{SELECT * FROM FCR.V_REPORT WHERE DATE BETWEEN to_date('14/09/2001' , 'dd/mm/yyyy') AND to_date('30/09/2011' , 'dd/mm/yyyy')} 

如果您移除大括号并将它放在导航器中,它就可以工作。

原文:

运行我的程序时,我有一个问题。在SQL导航器中的查询返回192行,但是当我在c#(Visual Studio 2010)上运行查询时,查询返回0行。 下面是我的C#代码:

public static DataTable GetReport(string date1, string date2) 
{ 
    DatabaseAdapter dba = DatabaseAdapter.GetInstance(); 
    string SqlQuery = 
    string.Format(@"SELECT * 
        FROM FCR.V_REPORT 
        WHERE DATE BETWEEN to_date('{0}' , 'dd/mm/yyyy') 
        AND to_date('{1}' , 'dd/mm/yyyy')", date1, date2); 
    OracleDataReader reader = dba.QueryDatabase(SqlQuery); 
    DataTable dt = new DataTable(); 
    dt.Load(reader); 
    int temp = dt.Rows.Count; 
    return dt; 
} 

这是我使用(返回192行)查询的SQL导航:

SELECT * 
FROM FCR.V_REPORT 
WHERE DATE BETWEEN to_date('01/01/2001' , 'dd/mm/yyyy') 
AND to_date('30/09/2011' , 'dd/mm/yyyy') 
+1

你可以粘贴'SqlQuery'的实际值(我的意思是,你可以通过'string.Format'调用的结果吗? –

+1

@Steve B ..i刚刚编辑的结果 – mikespiteri

+1

SqlQuery是空的......得到它***之后***调用string.Format,并请发布变量的值,而不是截图调试器。 –

尝试下探视图和重新创建。确保你的别名也正确。

我敢打赌,你从你的C#程序中传递的日期是不同的,因为你的sql语句是相同的。设置一个断点并确认日期完全相同。同时验证是否按照适当的顺序传入了date1和date2。

+2

我已检查并重新检查日期。这就是为什么我张贴在这里,因为它很奇怪。我在程序中做了一个断点来检查行数是否增加,但它仍然是0 – mikespiteri

在处理这类问题时,通常最好不要对错误起源的位置做出太多假设。如果您有权访问该框,我会运行跟踪并确保所运行的语句确实相同。如果它们是相同的,那么你知道你在应用程序的接收或处理方面有程序错误。

您可以修改您的语句以将结果插入临时表并验证您期望的192行是否存在。如果您正在执行完全相同的语句,并且临时表显示您正在获得结果,则预计您已经进一步缩小了问题范围,并且可以开始查找应用程序错误。

假设您的C#代码正在向数据库发送正确的查询,Oracle有几种方式根据会话以不同的方式运行相同的查询。您可能需要得到一个DBA来解决这个问题(例如,通过查看v $ sql中的实际执行语句),或者至少要排除这些奇怪的情况。

NLS_DATE_FORMAT

如果日期栏存储为串,就不会有的隐式转换为日期。如果SQL Navigator使用与C#不同的NLS_DATE_FORMAT,则转换可能会创建不同的日期。尽管如果他们不同,你很可能会得到一个错误,而不仅仅是0行。

Virtual Private Database

VPD可以断言添加到每个查询,可能使用不同的会话信息。例如,如果创建会话的程序像'%Navigator%'那么它可以为每个查询添加'where 1 = 0'。 (我知道这听起来很疯狂,但我看到了非常相似的东西。)

Advanced Query Rewrite

这意味着物化视图。但有些人用它来修复性能,有点像存储轮廓。一些邪恶的人用它来将你的查询改写成完全不同的查询。不同的会话设置(如QUERY_REWRITE_INTEGRITY和CURSOR_SHARING)可以解释为什么查询可以在一个会话中工作,而不是另一个会话。说到CURSOR_SHARING,如果设置为SIMILAR或FORCE,可能会导致一些罕见的问题。

我和其他开发工具和SQL Server经常遇到相同的情况。在我的情况下,我发现在查询工具中,我将有两个输出,即datagrid中的记录和结果窗格中的'rows affected'消息。但是,在我的开发IDE中,我看不到任何数据(除非我检查了其他数据集)。出于某种原因,它会返回受影响的行作为第一个结果集。当我关闭查询本身的rowcount选项时,数据显示在两个地方。

您也可以使用协议分析程序(例如Ethereal)并捕获TCP/IP通信量以验证请求在线路上是否相同。这也帮助我掐了一下。

祝你好运。

JL

我不知道是这是同一个问题,你的问题here

您的string.Format调用没有在SQL字符串本身中指定date1和date2值的格式。因此,它使用date1和date2的默认DateTime.ToString(),它可能类似于'16/09/2011 12:23:34',因此它与to_date语句中指定的格式不匹配。

试试这个:

string SqlQuery = string.Format(@"SELECT * FROM V_REPORT WHERE DATE BETWEEN 
            to_date('{0:dd/MM/yyyy}' , 'dd/mm/yyyy') 
            AND 
            to_date('{1:dd/MM/yyyy}' , 'dd/mm/yyyy')", 
            date1, 
            date2);  
+0

感谢大家的帮助。我解决了这个问题。我不确定有什么问题,但我放弃了查看表并重新创建它,并且它工作正常。我仍然不知道发生了什么事情,因为一切似乎都很好。再次感谢 – mikespiteri