我想在C#中创建基于OracleSQL的简单登录+注册表单。我正在使用Oracle的ManagedDataAccess客户端(来自NuGet)。
我试着像这样使用它:
OracleCommand query = db.CreateCommand();
query.CommandText = string.Format("insert into @tablename values(null, '@login', '@pwd', 0, null)");
query.Parameters.Add("@tablename", ConfigurationManager.AppSettings.Get("usersTableName"));
query.Parameters.Add(name: "@login", val: login);
query.Parameters.Add(name: "@pwd", val: HashPassword(pwd));
bool isCreated = (query.ExecuteReader().RecordsAffected > 0 ? true : false);
query.Dispose();
return isCreated;
^顺便说一下,可能应该有另一种方法来制作那种bool。可能它会自行投入到bool中。
结构非常简单:
"USERS"
(
"ID" NUMBER(10,0),
"USERNAME" VARCHAR2(16 BYTE),
"PASSWORD" VARCHAR2(64 BYTE),
"IS_LOGGED" NUMBER(1,0),
"IP" VARCHAR2(15 BYTE)
)
该代码失败。尝试使用' @',冒号等。如果我甚至让它工作,它会添加记录" @ login"用户名。字面意思是我在参数名称中写的内容。此外,它说ORA-00903错误"无效的表名" (它可能会将名称发送为" @ tablename"但是)...
代码以这种方式工作:
string q = string.Format("insert into {0} values(null, '{1}', '{2}', 0, null)",
ConfigurationManager.AppSettings.Get("usersTableName"), login, HashPassword(pwd));
当我将此字符串用作查询的CommandText时,它运行良好。我不想这样做,特别是因为SQL注入事情。
对于C#来说,我是一个完全新手,所以我可能在这么短的代码中犯了这么多错误。
答案 0 :(得分:0)
表名和列名不能作为参数。因为它阻止Oracle SQL解析器解析查询并创建执行计划。 您使用了' @ tablename'您的查询文字中的参数,您必须删除此参数并将其替换为' usersTableName'例如。 使用@作为参数说明符是在.Net环境(包括C#)中为包含Oracle的任何DBMS定义绑定参数的正确方法。虽然使用':'对Oracle而言也是正确的。
更多信息:
使用建议的绑定参数来提高性能并避免SQL注入。提高性能是Oracle缓存执行计划的结果,然后参数不能改变SQL语句的结构。
答案 1 :(得分:0)
您无法在Oracle SQL中绑定表名。您可以改为执行此类操作(并记住在构造SQL时注意SQL注入)
AFHTTPRequestOperationManager