2012-04-02 68 views
3

我正在为我的应用程序配置文件中定义的SQL Server和Oracle数据库编写C#应用程序。当我在SQL Server环境中运行代码时,它工作正常。我得到正确的结果。OracleDataAdapter未从查询填充DataTable

工作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(); 

不工作的甲骨文代码如下:

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

您使用的是什么版本的Oracle,并且您是否使用Oracle中的任何模式命名? – Turbot 2012-04-02 20:42:31

+0

我使用的是10.2。在这个例子中,模式是“DB”,即使它真的是别的东西。我能够在SQL Developer中运行查询,并得到2个结果。 – Matthew 2012-04-02 20:43:47

+0

Oracle Database 10g快速版版本10.2.0.1.0 - 产品 PL/SQL版本10.2.0.1.0 - 生产 核心\t 10.2.0.1.0 \t生产 TNS for 32-bit Windows:Version 10.2.0.1.0 - 生产 NLSRTL版本10.2.0.1.0 - 生产 – Matthew 2012-04-02 20:52:11

回答

3

问题是我登录到数据库的DBO帐户没有对该表的权限。我跑了一个简单的赠款,它运作得很好。

GRANT SELECT ON DB.ACTIONS TO USER; 
0

直接在数据库上运行查询(例如使用sqlplus,TOAD,SQLDEveloper等)。它会返回任何东西吗? 如果不是:

a)在SQL Server中,文本比较(STATUS ='Pending')在Oracle中不区分大小写,区分大小写。例如,您可能在状态列中有像“PENDING”这样的数据?

b)ACTION_DATE是日期数据类型吗?如果它是varchar,它将不起作用。

希望它有帮助。

+0

查询在SQLDeveloper中正常运行。字段类型是正确的。 甲骨文:ACTION_DATE是日期和状态字段值待定 – Matthew 2012-04-02 21:12:01

+0

其他可能的原因:1)也许是太明显了,你有没有使用的SQLDeveloper插入测试数据?如果你是这样做的交易? 2)你是否使用相同的用户名连接到数据库在SQLDeveloper和你的C#应用​​程序?我怀疑是这种情况,但可以在Oracle中创建一个策略,它可以向一个用户隐藏其他用户的某些记录(行级安全性,在Oracle中称为VPD)。 – arturro 2012-04-02 21:30:20

+0

这是表上的权限问题。我必须 GRANT SELECT ON DB.ACTIONS TO ROLE; 的OracleDataAdapter知道表列,但不会告诉我,如果我有权限访问即使我作为DBO记录在表中。 谢谢大家。 – Matthew 2012-04-02 21:34:18

0

我的建议是更改代码以区分诊断级别。

1)用简单的“从双选择sysdate”替换语句;查看是否有任何行返回。 2)如果没有返回,它可能是你的连接问题。查看您的连接属性。 3)如果某些东西是返回但不填充到数据集,请尝试使用oracle读取器来抛出输出并确实看到结果。

希望这会帮助你。

+0

当我将oracle部分的代码更改为stmt =“SELECT 1 AS ACTION_ID,'作为SYS.DUAL的ACTION测试'”我在我的DataTable中得到结果 – Matthew 2012-04-02 21:28:37

+0

这是表中的权限问题。我必须 GRANT SELECT ON DB.ACTIONS TO ROLE; 的OracleDataAdapter知道表列,但不会告诉我,如果我有权限访问即使我作为DBO记录在表中。 谢谢大家。 – Matthew 2012-04-02 21:34:07