首先我想问一下想要执行带参数的sql语句oracle用户需要哪些权限。事情是这样的,我做了个查询,很简单代码如下: protected void Page_Load(object sender, EventArgs e)
    {
        try
        {            string str = "user id='user1';server=abcd;password=1234567";            OracleConnection dbConn = new OracleConnection(str);
            dbConn.Open();
            OracleCommand dbCmd = new OracleCommand();            dbCmd.Connection = dbConn;            dbCmd.CommandType = CommandType.Text;                       OracleParameter parm = new OracleParameter(":unknown" , OracleType.VarChar);            parm.Value = "123";            dbCmd.Parameters.Add(parm);            dbCmd.CommandText = "select numb from table2 where  numb==:unknown  ";            OracleDataReader dr = dbCmd.ExecuteReader();            if (dr.Read())
            {
                string value1 = dr.GetString(0);
                Label1.Text = value1;            }
        }
        catch (Exception ex)
        {            //throw (ex);        }
我用此方法查询两个库都能查到数据(修改str),这两个库都不同,用此方法查询第三个库的时候就是查询不到数据,但是在sqlplus里用select * from tablename where numb='123'能查询到数据。我一开始怀疑是连接数据库的用户user的问题,可能是权限不够。可是我查了一下它的角色和权限和另两个用户的一样。我彻底崩溃了,如果查不出原因那就只有把程序改称拼接sql语句来执行了。有遇到过这种情况的同学吗?明天放假了可是一点都高兴不起来。

解决方案 »

  1.   

    你的sql语句里面好像是两个等于号了  where  numb==:unknown  
      

  2.   

    OracleParameter parm = new OracleParameter("unknown" , OracleType.VarChar); 
    把unknown前面的冒号去掉看看
    还有就是
    dbCmd.CommandText = "select numb from table2 where  numb==:unknown  "; 
    这个多了一个等号。
      

  3.   

    如果数据库休假,那sqlplus 也应该查不到,但 sqlplus 查到了,证明数据库是正常可以访问的。
    Oracle中,参数是要加:的。所以:Unknown是正确的。select numb from table2 where  numb==:unknown这里少一个等号。还有就是
    string str = "user id= 'user1 ';server=abcd;password=1234567"; 
    改成
    string str = "user id=user1;server=abcd;password=1234567"; 
    你的用户名本身有空格的?会不会是 Oracle   数据库的版本不一样,数据类型不一样?
      

  4.   

    select numb from table2 where  numb=:unknown
    只有一个等号,我贴代码时才写错的,原代码的库表名不是这个我改了。
    连接数据库的字符串不会错的,因为连接其他两个库没问题,如果用户名有问题的话是不可能连接上数据库的,应该早就报异常了。
    如果sql = select numb from table ,也就是说不带参数unknown的话是能查出数据的,关键就是不支持带参数。
    oracle的版本不一样带参的写法不一样吗?
      

  5.   

    http://msdn2.microsoft.com/en-us/library/system.data.oracleclient.oracleparametercollection.aspxquote:
    When using named parameters in an SQL statement called by an OracleCommand of CommandType.Text, you must precede the parameter name with a colon (:). However, in a stored procedure, or when referring to a named parameter elsewhere in your code (for example, when adding OracleParameter objects to the Parameters property), do not precede the named parameter with a colon (:). The data provider supplies the colon automatically.
      

  6.   

    如楼上说的
    OracleParameter parm = new OracleParameter(":unknown" , OracleType.VarChar); 
    句改为
    OracleParameter parm = new OracleParameter("unknown" , OracleType.VarChar); 
    参数使用时不得加冒号
      

  7.   

    我在本地加冒号可以查到数据,但我也觉得不应该加冒号,变量名应该是unknown而不是:unknow,两个不同的概念。明天测试吧,现在没环境测试,郁闷....
      

  8.   

    问题也不是出在参数名称上。代码如下:
     protected void Page_Load(object sender, EventArgs e) 
        { 
            try 
            {             string str = "user id= 'user1 ';server=abcd;password=1234567";             OracleConnection dbConn = new OracleConnection(str); 
                dbConn.Open(); 
                OracleCommand dbCmd = new OracleCommand();             dbCmd.Connection = dbConn;             dbCmd.CommandType = CommandType.Text;                         OracleParameter parm = new OracleParameter("unknown" , OracleType.VarChar);             parm.Value = "123";             dbCmd.Parameters.Add(parm);             dbCmd.CommandText = "select numb from table2 where  numb=:unknown  ";             OracleDataReader dr = dbCmd.ExecuteReader();             if (dr.Read()) 
                { 
                    string value1 = dr.GetString(0); 
                    Label1.Text = value1;             } 
            } 
            catch (Exception ex) 
            {             //throw (ex);         } 
    一样去不到值,但在sqlplus里直接用select numb from table2 where  numb='123';就能查到数据。真是见鬼了!用带参数的sql查询到底需要什么样的配置或者权限,如果版本不一样,是不是参数的写法不一样?不能用冒号用其他的符号呢?