使用 Devart EF Drivers for Oracle 执行带参数的 SQL 命令
Execute SQL command with parameter using Devart EF Drivers for Oracle
我尝试使用 sql 命令和参数从 Oracle table 中删除记录,然后再插入新记录,因为该值来自浏览器。
这是代码:
var tableName = "<myTableName>";
context.Database.ExecuteSqlCommand("DELETE :p0", tableName);
Oracle 正在抛出 "ORA-00903: invalid table name"。
我也试过:
context.Database.ExecuteSqlCommand("DELETE :p0", new OracleParameter("p0", OracleDbType.VarChar, 200, tableName, ParameterDirection.Input)
有什么简单的东西是我遗漏的吗?
如果你将 table 反弹到 ALL_TABLES
你应该能够防止任何 SQL 注入攻击:
private bool TruncateTable(string Schema, string Table)
{
OracleCommand cmd = new OracleCommand("select count (*) from all_tables " +
"where owner = :SCHEMANAME and table_name = :TABLENAME", conn);
cmd.Parameters.Add("SCHEMANAME", Schema.ToUpper());
cmd.Parameters.Add("TABLENAME", Table.ToUpper());
if (Convert.ToInt32(cmd.ExecuteScalar()) == 0)
return false;
cmd.CommandText = string.Format("delete from {0}.{1}", Schema, Table);
cmd.Parameters.Clear();
cmd.ExecuteNonQuery();
return true;
}
在 DevArt 上,我认为 Add
应该是 AddWithValues
,但在其他方面看起来是一样的。
在这种情况下,return 值为 false 意味着没有这样的 table。这一切都假定用户有能力从有问题的 table 中删除。
此外,如果可能的话,truncate
是 delete from
的不错替代品。它快了很多,并重置了高水位线。我认为您需要成为所有者或拥有 "drop any table" 权限才能执行此操作,但还有其他解决方法——例如,让 DBA 设置一个存储过程来对某些 [=27] 进行截断=]s.
我尝试使用 sql 命令和参数从 Oracle table 中删除记录,然后再插入新记录,因为该值来自浏览器。
这是代码:
var tableName = "<myTableName>";
context.Database.ExecuteSqlCommand("DELETE :p0", tableName);
Oracle 正在抛出 "ORA-00903: invalid table name"。
我也试过:
context.Database.ExecuteSqlCommand("DELETE :p0", new OracleParameter("p0", OracleDbType.VarChar, 200, tableName, ParameterDirection.Input)
有什么简单的东西是我遗漏的吗?
如果你将 table 反弹到 ALL_TABLES
你应该能够防止任何 SQL 注入攻击:
private bool TruncateTable(string Schema, string Table)
{
OracleCommand cmd = new OracleCommand("select count (*) from all_tables " +
"where owner = :SCHEMANAME and table_name = :TABLENAME", conn);
cmd.Parameters.Add("SCHEMANAME", Schema.ToUpper());
cmd.Parameters.Add("TABLENAME", Table.ToUpper());
if (Convert.ToInt32(cmd.ExecuteScalar()) == 0)
return false;
cmd.CommandText = string.Format("delete from {0}.{1}", Schema, Table);
cmd.Parameters.Clear();
cmd.ExecuteNonQuery();
return true;
}
在 DevArt 上,我认为 Add
应该是 AddWithValues
,但在其他方面看起来是一样的。
在这种情况下,return 值为 false 意味着没有这样的 table。这一切都假定用户有能力从有问题的 table 中删除。
此外,如果可能的话,truncate
是 delete from
的不错替代品。它快了很多,并重置了高水位线。我认为您需要成为所有者或拥有 "drop any table" 权限才能执行此操作,但还有其他解决方法——例如,让 DBA 设置一个存储过程来对某些 [=27] 进行截断=]s.