使用Devart EF Drivers for Oracle执行带有参数的SQL命令

时间:2016-12-30 20:07:49

标签: .net oracle devart

我尝试在使用sql命令和参数插入新表之前从Oracle表中删除记录,因为该值来自浏览器。

这是代码:

var tableName = "<myTableName>";
context.Database.ExecuteSqlCommand("DELETE :p0", tableName);

Oracle正在抛出&#34; ORA-00903:无效的表名&#34;。

我也尝试过:

context.Database.ExecuteSqlCommand("DELETE :p0", new OracleParameter("p0", OracleDbType.VarChar, 200, tableName, ParameterDirection.Input)

我缺少一些简单的东西吗?

1 个答案:

答案 0 :(得分:1)

如果您针对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,但看起来会相同。

在这种情况下,返回值为false意味着没有这样的表。这一切都预示着用户可以从相关表中删除。

此外,如果可能,truncatedelete from的不错选择。它的速度要快得多,并且会重置高水位线。我认为你需要成为一个所有者或者让#34;放弃任何一张桌子&#34;有权执行此操作,但还有其他方法 - 例如,让DBA设置存储过程来对某些表执行截断。