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