我正在尝试使用Oracle.ManagedDataAccess库在oracle 12数据库上运行CREATE USER
查询。该查询在不使用命名参数的情况下完美运行。但是,当我尝试使用命名参数时,参数似乎没有正确传递给查询。
我尝试通过以下代码使用参数(注意:我正在使用 Oracle.ManagedDataAccess 库)
using(OracleConnection con = new OracleConnection(_connectionString)) {
con.Open();
using(OracleCommand cmd = con.CreateCommand()) {
cmd.CommandText = "CREATE USER :username IDENTIFIED BY :password";
cmd.Parameters.Add("username", "A_TESTUSER");
cmd.Parameters.Add("password", "A_PASSWORD");
//cmd.Parameters.Add(":username", "A_TESTUSER"); <- also tried
//cmd.Parameters.Add(":password", "A_PASSWORD"); <- also tried
//cmd.Parameters.Add(":username", OracleDbType.Varchar2).Value = "A_TESTUSER"; <- also tried
//cmd.Parameters.Add(":password", OracleDbType.Varchar2).Value = "A_TESTPASS"; <- also tried
cmd.ExecuteNonQuery();
}
}
这将导致以下异常。
Oracle.ManagedDataAccess.Client.OracleException (0x80004005): ORA-01935: missing user or role name.
当我使用这样的数据内联运行查询时,设置该查询即可工作
cmd.CommandText = "CREATE USER A_TESTUSER IDENTIFIED BY A_PASSWORD";
我还尝试使用@
而不是:
来指示没有成功的参数。如何将参数传递给查询?
答案 0 :(得分:0)
我认为您不能为CREATE USER
使用参数化的查询,因此应该
cmd.CommandText = String.Format("CREATE USER {0} IDENTIFIED BY \"{1}\"", "A_TESTUSER", "A_PASSWORD");
注意:尽管此解决方案有效,但是它不能保护您免受SQL注入的侵害。除此之外,您还应该对输入进行必要的检查。