ORA-01036:通过C#运行查询时的非法变量名称/编号

我试图在以下代码中使用C#中的OracleCommand对Oracle数据库使用ALTER USER查询。 如果Username和password的值不是空字符串,它将创建查询。 但是当执行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块):

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

Oracle中的绑定变量只允许在DML和查询语句中的某些特殊位置使用。 您正尝试在不允许使用绑定变量的位置使用绑定变量。 因此错误。

构建没有绑定变量的语句。 使用字符串连接构建完整的查询字符串。

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

背景

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

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

我只花了几天检查参数,因为我必须将60传递给存储过程。 事实certificate,其中一个变量名称(我加载到列表中并传递给我创建的Oracle Write方法)最后在名称中有一个空格。 当与存储过程中的变量进行比较时,它们是相同的,但在我用来比较它们的编辑器中,我没有注意到额外的空间。 在过去的4天里,我开始疯狂地尝试我能找到的一切,甚至改变.net Oracle驱动程序。 只是想把它扔出去,这样它可以帮助别人。 我们倾向于专注于角色而忽略空间。 。 。

您定义了一个oracleCommand但在’for’中使用了它。 这意味着您要向一个OracleCommand添加具有相同名称的参数。 你应该使用cmd.Parameters.clear()来刷新你的参数。

 for(int i=0;i 

Oracle erro ORA-01036意味着查询在某处使用了未定义的变量。 从查询中,我们可以确定使用哪些变量:所有以@开头的变量。 但是,如果您将其输入到advacned查询中,则重要的是确认所有变量都具有匹配的输入参数,如果您的Oracle数据库区分大小写,则包括变量名称中的相同大小写。

您不能使用参数将用户/表名传递给pl / sql。 您可以创建一个过程并构建sql并立即执行以实现该目的。

如果您还缺少cmd.CommandType = System.Data.CommandType.StoredProcedure;发生此错误cmd.CommandType = System.Data.CommandType.StoredProcedure;

  cmd.Parameters.Add(new OracleParameter("GUSERID ", OracleType.VarChar)).Value = userId; 

我有八个参数,一个在末尾有空格,如上面的“GUSERID”代码所示。删除了空间,一切都开始工作了。