c# - ORA-01036 : illegal variable name/number when running query through C#

标签 c# oracle

我正在尝试在以下代码中使用 C# 中的 OracleCommand 对 Oracle 数据库使用 ALTER USER 查询。如果用户名和密码的值不是空字符串,它会创建查询。但是在执行 ExecuteNonQuery() 时出现错误 "ORA-01036: illegal variable name/number"

  string updateQuery = "ALTER USER :user IDENTIFIED BY :password";
  connection = new OracleConnection(LoginPage.connectionString);
  connection.Open();                
  OracleCommand cmd = new OracleCommand(updateQuery, connection);
  cmd.Connection = connection;  
  for(int i=0;i<usersList.Count;i++)
        {
            if (!(selectedUsersArray[i].Equals("")) && !passwordArray[i].Equals(""))
            {
                OracleParameter userName = new OracleParameter();
                userName.ParameterName = "user";
                userName.Value = selectedUsersArray[i];

                OracleParameter passwd = new OracleParameter();
                passwd.ParameterName = "password";
                passwd.Value = passwordArray[i];

                cmd.Parameters.Add(userName);
                cmd.Parameters.Add(passwd);

                cmd.Prepare();
                cmd.ExecuteNonQuery();                   


            }
        }

请问我的实现有什么问题吗?

最佳答案

根本原因

在 Oracle 中,您有三种 SQL 语句(另外还有 PL/SQL block ):

  • 数据定义语言 (DDL) 中的语句。这些语句修改数据库的结构。它们通常以动词“ALTER”或“CREATE”开头
  • 数据修改语言 (DML) 中的语句。这些语句修改表内部的内容,而每个表的结构保持不变。这些语句通常以“INSERT”、“MERGE”或“DELETE”开头。
  • 我称之为“查询语言”的语句(这些语句似乎没有规范的名称)。该语句以动词“SELECT”开头。

Oracle中的绑定(bind)变量只允许在DML和查询语句中的一些特殊地方使用。您正试图在不允许的地方使用绑定(bind)变量。因此错误。

解决方案

在没有绑定(bind)变量的情况下构建您的语句。构建完整的查询字符串,而不是使用字符串连接。

如果您想在连接字符串之前清理输入,请使用 DBMS_ASSERT包。

背景

只有当 Oracle 可以在不知道变量值的情况下构建查询计划时才可以使用绑定(bind)变量。对于 DDL 语句,没有查询计划。因此不允许绑定(bind)变量。

在 DML 和查询语句中,只有在元组内部使用绑定(bind)变量(关于基础集合论)时才允许使用绑定(bind)变量,即当将值与表中的值进行比较或插入值时在一张 table 上。他们不允许更改执行计划的结构(例如更改目标表或更改比较次数)。

关于c# - ORA-01036 : illegal variable name/number when running query through C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21375288/

相关文章:

c# - MVC3 Razor - Response.Write Substitution 总是在页面顶部显示我的文本

c# - This Row already belongs to another table 尝试添加行时出错?

excel - 使用 PL/SQL 创建 Excel 文件 (.xlsx)

python - 在oracle SQL*PLUS中执行Python脚本

mysql - 从数据库表中检索最小和最大字符串

c# - Akka.Net 远程处理 : ActorSelection vs. IActorRef

c# - 如何在api项目的Startup类中使用集成测试项目的设置?

c# - 如何在 HostingStartup 中注册中间件?

sql - 如何在oracle中将sysdate转换为UTC时间

oracle - Tomcat:用 OracleConnectionPoolDataSource 替换 DBCP