参数化查询可创建一个引发缺少用户或角色名称异常的用户

时间:2018-11-22 11:41:25

标签: c# .net oracle named-parameters

我正在尝试使用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";

我还尝试使用@而不是:来指示没有成功的参数。如何将参数传递给查询?

1 个答案:

答案 0 :(得分:0)

我认为您不能为CREATE USER使用参数化的查询,因此应该

cmd.CommandText = String.Format("CREATE USER {0} IDENTIFIED BY \"{1}\"", "A_TESTUSER", "A_PASSWORD");

注意:尽管此解决方案有效,但是它不能保护您免受SQL注入的侵害。除此之外,您还应该对输入进行必要的检查。