Выполните команду SQL с параметром, используя драйверы Devart EF для Oracle

Я пытаюсь удалить записи из таблицы Oracle, прежде чем вставлять новые, используя команду sql и параметр, потому что значение поступает из браузера.

Это код:

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

Oracle выдает "ORA-00903: неверное имя таблицы".

Я также попробовал:

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

Есть что-то простое, что мне не хватает?

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 означало, что такой таблицы не было. Все это предполагает, что пользователь имеет возможность удалить из рассматриваемой таблицы.

Также, если возможно, truncate хорошая альтернатива delete from, Это немного быстрее и сбрасывает отметку максимальной воды. Я думаю, что вы должны быть владельцем или иметь привилегию "удалить любую таблицу", чтобы сделать это, но есть и другие способы обойти это - например, установить администратором базы данных хранимую процедуру для выполнения усечения в определенных таблицах.

Другие вопросы по тегам