首先我想问一下想要执行带参数的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语句来执行了。有遇到过这种情况的同学吗?明天放假了可是一点都高兴不起来。
{
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语句来执行了。有遇到过这种情况的同学吗?明天放假了可是一点都高兴不起来。
把unknown前面的冒号去掉看看
还有就是
dbCmd.CommandText = "select numb from table2 where numb==:unknown ";
这个多了一个等号。
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 数据库的版本不一样,数据类型不一样?
只有一个等号,我贴代码时才写错的,原代码的库表名不是这个我改了。
连接数据库的字符串不会错的,因为连接其他两个库没问题,如果用户名有问题的话是不可能连接上数据库的,应该早就报异常了。
如果sql = select numb from table ,也就是说不带参数unknown的话是能查出数据的,关键就是不支持带参数。
oracle的版本不一样带参的写法不一样吗?
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.
OracleParameter parm = new OracleParameter(":unknown" , OracleType.VarChar);
句改为
OracleParameter parm = new OracleParameter("unknown" , OracleType.VarChar);
参数使用时不得加冒号
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查询到底需要什么样的配置或者权限,如果版本不一样,是不是参数的写法不一样?不能用冒号用其他的符号呢?