我正在尝试在以下代码中使用 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/