查询的问题 - 当查询在SQL导航运行返回行,但不是在我的C#程序
查询的问题 - 当查询在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')
尝试下探视图和重新创建。确保你的别名也正确。
我敢打赌,你从你的C#程序中传递的日期是不同的,因为你的sql语句是相同的。设置一个断点并确认日期完全相同。同时验证是否按照适当的顺序传入了date1和date2。
我已检查并重新检查日期。这就是为什么我张贴在这里,因为它很奇怪。我在程序中做了一个断点来检查行数是否增加,但它仍然是0 – mikespiteri
在处理这类问题时,通常最好不要对错误起源的位置做出太多假设。如果您有权访问该框,我会运行跟踪并确保所运行的语句确实相同。如果它们是相同的,那么你知道你在应用程序的接收或处理方面有程序错误。
您可以修改您的语句以将结果插入临时表并验证您期望的192行是否存在。如果您正在执行完全相同的语句,并且临时表显示您正在获得结果,则预计您已经进一步缩小了问题范围,并且可以开始查找应用程序错误。
假设您的C#代码正在向数据库发送正确的查询,Oracle有几种方式根据会话以不同的方式运行相同的查询。您可能需要得到一个DBA来解决这个问题(例如,通过查看v $ sql中的实际执行语句),或者至少要排除这些奇怪的情况。
NLS_DATE_FORMAT
如果日期栏存储为串,就不会有的隐式转换为日期。如果SQL Navigator使用与C#不同的NLS_DATE_FORMAT,则转换可能会创建不同的日期。尽管如果他们不同,你很可能会得到一个错误,而不仅仅是0行。
VPD可以断言添加到每个查询,可能使用不同的会话信息。例如,如果创建会话的程序像'%Navigator%'那么它可以为每个查询添加'where 1 = 0'。 (我知道这听起来很疯狂,但我看到了非常相似的东西。)
这意味着物化视图。但有些人用它来修复性能,有点像存储轮廓。一些邪恶的人用它来将你的查询改写成完全不同的查询。不同的会话设置(如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);
感谢大家的帮助。我解决了这个问题。我不确定有什么问题,但我放弃了查看表并重新创建它,并且它工作正常。我仍然不知道发生了什么事情,因为一切似乎都很好。再次感谢 – mikespiteri
你可以粘贴'SqlQuery'的实际值(我的意思是,你可以通过'string.Format'调用的结果吗? –
@Steve B ..i刚刚编辑的结果 – mikespiteri
SqlQuery是空的......得到它***之后***调用string.Format,并请发布变量的值,而不是截图调试器。 –