2016-12-30 10 views
1

SQLコマンドとパラメータを使用して新しいテーブルを挿入する前に、Oracleテーブルからレコードを削除しようとしています。パラメータを使用してパラメータを指定してSQLコマンドを実行します.OracleのDevart EFドライバ

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) 

は、私が行方不明です単純なものはありますか?

+0

パラメータを使用してテーブル名またはカラム名を指定することはできません。ところで、SQLの構文はDELETE FROM _tablename_ – Steve

+0

ですので、どうやってSQLインジェクションを防ぐのですか? はSqlDeveloperで動作します – samneric

+0

ユーザーはテーブル名を入力できません。テーブルのリストを提示して、テーブル名 – Steve

答えて

1

あなたはALL_TABLESに対してテーブルをバウンス場合は、任意のSQLインジェクション攻撃を防ぐことができる必要があります:DevArtオン

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; 
} 

は、私はAddではなくAddWithValuesになると思いますが、そうでない場合と同じになります。

この場合、戻り値falseはそのようなテーブルが存在しないことを意味します。これはすべて、ユーザが問題のテーブルから削除できることを前提としています。

さらに可能であれば、truncatedelete fromの良い代替品です。これはかなり速く、最高水準点をリセットします。私はあなたが所有者である必要があると思う、またはこれを行うために "テーブルを落とす"特権を持っている必要があると思いますが、DBAにストアドプロシージャを設定して特定のテーブルを切り捨てるなど、

+0

乾杯。それは注射を避ける良い方法です。私は実際にEFを使用していたので、テーブルがedmxモデルに存在することを確認するためにリフレクションを使用しました:) – samneric

関連する問題