代码之家  ›  专栏  ›  技术社区  ›  Mark Baijens

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

  •  0
  • Mark Baijens  · 技术社区  · 7 年前

    我在试着运行一个 CREATE USER 使用oracle.managedataaccess库查询oracle 12数据库。此查询在不使用命名参数的情况下工作正常。但是当我尝试使用命名参数时,看起来参数没有正确地传递给查询。

    我尝试将参数与以下代码一起使用(注意:我使用 Oracle.ManagedData访问 图书馆):

    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 回复  |  直到 7 年前
        1
  •  0
  •   Mark Baijens    7 年前

    我认为你不能使用参数化 查询 对于 CREATE USER ,所以应该是

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

    注: 尽管这个解决方案可以工作,但它不能保护您免受SQL注入的影响。除此之外,您还应该对输入进行必要的检查。