我正在尝试使用ALTER USER
在以下代码中,使用 C# 中的 OracleCommand 查询 Oracle 数据库。如果用户名和密码的值不是空字符串,它将创建查询。但我收到一个错误"ORA-01036: illegal variable name/number"
when ExecuteNonQuery()
被执行。
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和查询语句中的一些特殊位置。您试图在不允许的地方使用绑定变量。因此出现了错误。
Solution
构建不带绑定变量的语句。构建完整的查询字符串,而不是使用字符串连接。
如果您想在连接字符串之前清理输入,请使用数据库管理系统_断言 http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_assert.htm包裹。
背景
仅当 Oracle 可以在不知道变量值的情况下构建查询计划时,才能使用绑定变量。对于DDL语句,没有查询计划。因此不允许绑定变量。
在 DML 和查询语句中,仅当在元组内部使用绑定变量时(关于底层集合理论),即当将值与表中的值进行比较或将值插入表中时,才允许使用绑定变量。他们不允许更改执行计划的结构(例如更改目标表或更改比较次数)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)