现在需要查询数据库中的一张表的表结构情况,查询语句为:
select column_name, data_type, data_length, data_precision, data_scale, nullable, data_default
from all_tab_columns
where lower(table_name) = '......'
order by column_id ASC
该语句在PL/SQL中执行时,可查询出现53条记录,但在C#做好的程序中执行,查出的记录数为0,调试时未发现运行时错误。
在程序中,是用一个循环来查询几十张表的表结构情况,发现大多数都能正常查询,只有两张表不能。可能是什么原因呢?

解决方案 »

  1.   

    条件传递的问题应该。在c#中把你的sql打印一下看看,就一目了然了。
      

  2.   

    我是在C#调试中执行把发向数据库执行的SQL语句拷贝到PL/SQL中执行的,在程序中返回的0条记录,在PL中返回53条记录。
      

  3.   

    楼主看看这样行不行
    lower(to_char(table_name))
      

  4.   

    QueryTable(string tableName)
    这是我定义的一个方法,是用一个循环调用该方法的:
    for(int i = 0; i < ...; i++)
    {
        QueryTable(tableName);
    }
    在QueryTable方法内,使用到一个自定义的类CTable,定义了该类的一个实例t,
    该类有一个方法为Query(string sql),作用是传入一个sql语句,返回DataTable,
    在QueryTable方法内,对参数tableName(表名)组织出一个sql语句,调用t.Query(sql)
    我奇怪的是:
    1、如果组织sql语句时错误,那么另有几十张表在调用QueryTable方法时为什么没有问题?
    2、在调试时,我是在t.Query方法内设置断点,在其内部获取传入的sql语句,如果是传递参数的问题,那所得的sql语句就有问题,将该sql语句拷贝到PL/SQL中执行应该报错或查询结果也为0,但事实是查询正常,能获得该表的相应表结构记录。
      

  5.   

    code=[SQL]
    经测试,以下情况会出现楼主的问题
    PLSQL查询时,查询用户为userA,表tableA属于userA,故执行
    select column_name, data_type, data_length, data_precision, data_scale, nullable, data_default
    from all_tab_columns
    where lower(table_name) = 'tableA'
    order by column_id ASC
    时会有53条记录
    程序运行时,登录数据库的用户为userB,表tableA不属于userB,故执行查询时查不到任何记录。
    请楼主检查userB是否有tableA的权限!
    [/code]
      

  6.   

    6楼的朋友:
    我查了一下表的所有者,似乎是权限原因,似乎又不全是:
    对照了两张表tableA(查不到)和tableB(查到),
    tableA的所有者为A,tableB的所有者为B,而程序中和PL/SQL中都是用system用户登录的。
    为什么一个能查到,另一个查不到呢?
      

  7.   

    请检查你C#连接字符串中的数据库用户,用该用户登录PLSQL执行下查询,看下结果
      

  8.   

    将C#中执行的SQL语句字符串输出一下,很可能是字符串拼接或参数不正确造成的。
    在程序中加断点,并输出。
      

  9.   

    楼主用的什么版本的ORACLE?system用户在程序连接中使用时验证方式会与在PL-SQL中的验证方式会不一样。在PL-SQL中可能拥有DBA相关的权限,当它从程序中连接时,它的权限只是NORMAL。所以你的表A,表B可能由不同的用户建立在不同的时期。而SYSTEM用户只是对表B有权限。你可以显示在oracle里面GRANT这个表A给SYSTEM,然后再在程序中试一下。