使用 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 中删除。

此外,如果可能的话,truncatedelete from 的不错替代品。它快了很多,并重置了高水位线。我认为您需要成为所有者或拥有 "drop any table" 权限才能执行此操作,但还有其他解决方法——例如,让 DBA 设置一个存储过程来对某些 [=27] 进行截断=]s.