我正在为我的应用程序配置文件中定义的SQL Server和Oracle数据库编写C#应用程序。当我在SQL Server环境中运行代码时,它工作正常。我得到了正确的结果。
正在运行的SQL Server代码在这里:
sqlConn.Open();
stmt = "SELECT ACTION_ID, ACTION FROM DB.ACTIONS WHERE ACTION_DATE < GETDATE() AND STATUS = 'Pending'";
SqlDataAdapter sqlAdapt = new SqlDataAdapter(stmt, sqlConn);
sqlAdapt.Fill(dt);
sqlConn.Close();
无效的Oracle代码如下:
oraConn.Open();
stmt = "SELECT ACTION_ID, ACTION FROM DB.ACTIONS WHERE ACTION_DATE < SYSDATE AND STATUS = 'Pending'";
OracleDataAdapter oraAdapt = new OracleDataAdapter(stmt, oraConn);
oraAdapt.Fill(dt);
oraConn.Close();
我正在尝试用结果填充数据表dt。我首先尝试使用DataSet并使用DataSet填充DataTable,但是当它在SQL Server中时,它在Oracle中不起作用。似乎有一些简单的缺失。
我没有收到任何错误,我只是从Oracle获得0结果集,即使我知道有数据可以被拉出来。
答案 0 :(得分:3)
问题是我登录数据库的DBO帐户没有对表的权限。我跑了一个简单的补助金,效果很好。
GRANT SELECT ON DB.ACTIONS TO USER;
答案 1 :(得分:1)
我的建议是更改代码以分隔诊断级别。
1)用简单的“select sysdate from dual”替换语句;看看是否有任何行返回。
2)如果没有返回,则可能是您的连接问题。查看您的连接属性。
3)如果有东西返回但没有填充到数据集,请尝试使用oracle reader抛出输出并查看结果。
希望这会对你有所帮助。
答案 2 :(得分:0)
直接在DB上运行查询(例如使用sqlplus,TOAD,SQLDEveloper等)。它会返回什么吗? 如果不是:
a)在SQL Server中,文本比较(STATUS ='Pending')在Oracle中不区分大小写,区分大小写。也许您在状态栏中有数据,例如'PENDING'?
b)ACTION_DATE是日期数据类型吗?如果它是varchar则不起作用。
希望它有所帮助。