我有一个参数表,我有一个参数来说明我的程序是否应该运行,我正在尝试获取此值以检查函数。
这是函数
private static bool shouldRun()
{
OracleCommand c = conn.CreateCommand();
c.CommandText = "select value from parameters where lower(name) = lower('valuetocheck')"; // this one doesn't work
//c.CommandText = "select 'Y' from dual"; - This one works
c.CommandType = System.Data.CommandType.Text;
OracleDataReader dr = c.ExecuteReader();
dr.Read();
string s = dr.GetString(0); // exception on this line
return false;
}
其他信息如下:
对已关闭对象的无效操作
我已经尝试过从双重中选择,正如你在上面看到的,它完全正常,但是当我尝试运行实际查询时它不喜欢它。我在SQL Developer中检查了查询,它运行正常。
我已经浏览了SO和其他网站,我在这个问题上得到的唯一信息是该命令与连接无关,正如您在上面看到的那样。
我也尝试过做
OracleCommand c;
c.Connection = conn;
这也行不通。
对此的任何见解都会很棒,谢谢!
答案 0 :(得分:4)
我最近遇到了同样的问题。我得到了“关闭对象上的无效操作”,但是当我调试代码时,关闭的是 OracleDataReader ,而不是 OracleConnection 。我的问题是查询retuned
是一个空响应,如果没有数据, DataReader 会自行关闭。所以我的决议只是通过添加以下内容来检查数据读取器是否有任何行。
dro.Read();
if (dro.HasRows)
{
//Do your
}
我希望它有所帮助。
答案 1 :(得分:3)
当Oracle发出此错误时 - "对已关闭的对象进行无效操作",通常情况下,实际发生的是用户对他们尝试访问的对象没有访问权限数据库。检查您的连接字符串,并确保该连接字符串中列出的用户确实拥有查询中对象的权限 - 在这种情况下,读取对Parameters表的访问权限。
答案 2 :(得分:0)
注意:虽然此答案中的信息不能直接解决原始问题中的问题,但我发现此问题和其他答案对于确定其他相关情况的解决方案非常有帮助。 >
从非托管Oracle.DataAccess
库更改为托管Oracle.ManagedDataAccess
库时,我们发现了一个非常棘手的区别。显然,对于非托管库, 不需要进行dr.Read()
调用,但是对于托管库,绝对是必需的。 >
切换到托管库后,我们所有的调用都类似于在问题示例中构造的示例,需要在尝试从dr.Read()
对象中获取任何数据之前添加dr
,否则我们将收到相同的“对关闭的对象执行无效操作”消息。
答案 3 :(得分:0)
检查您的连接字符串
替换conn.State == ConnectionState。用conn.State关闭!= ConnectionState.open