1

更新された質問:dataadapterに送信する前にcommand.textを確認する以外に、update / drop / create / delete / insertコマンドを含まないコマンドのみをdataadapterに強制的に受け入れる方法はありますか(そうでない場合は例外をスローします)。datareader dataadapterまたはその他のドットネットによって提供されるそのような組み込み機能はありますか?

注:DataReaderは結果を返し、更新クエリも受け入れて結果を返します。(私はいくつかの間違いを省略しているかもしれませんが、リーダーを実行する直前に更新コマンドを表示し、成功後にメッセージを表示していますが、すべてうまくいっています

4

4 に答える 4

2

文字列でいくつかのキーワードを検索できますか?CREATE、UPDATE、INSERT、DROPのように、またはクエリがSELECTで始まらない場合は?それとも薄っぺらすぎますか?

また、アプリケーションが使用する、読み取り機能のみを持つログインを作成することもできます。オブジェクトにそのプロパティがあるかどうかはわかりませんが、サーバーにトランザクションを拒否させることができます。

于 2012-09-21T11:32:35.217 に答える
1

行う必要があるのは、に対して準備されたINSERT、UPDATE、またはDELETEステートメントがないことを確認することだけですDataAdapter。コードは次のようになります。

var dataAdapter = new SqlDataAdapter("SELECT * FROM table", "connection string");

また

var dataAdapter = new SqlDataAdapter("SELECT * FROM table", sqlConnectionObject);

そして、bam、あなたは読み取り専用のデータアダプタを持っています。

于 2012-09-21T11:38:27.907 に答える
1

DataTableが必要な場合は、次のメソッドが短く、複雑さが軽減されます。

public DataTable GetDataForSql(string sql, string connectionString)
{
    using(SqlConnection connection = new SqlConnection(connectionString))
    {
        using(SqlCommand command = new SqlCommand())
        {
            command.CommandType = CommandType.Text;
            command.Connection = connection;
            command.CommandText = sql;
            connection.Open();          
            using(SqlDataReader reader = command.ExecuteReader())
            {
                DataTable data = new DataTable();
                data.Load(reader);
                return data;
            }

        }

    }

}

利用方法:

try{
    DataTable results = GetDataForSql("SELECT * FROM Table;", ApplicationSettings["ConnectionString"]);
}
catch(Exception e)
{
    //Logging
    //Alert to user that command failed.
}

ここでDataAdapterを使用する必要は実際にはありません。実際には、必要なものではありません。Update、Delete、またはInsertコマンドが使用されている場合、なぜ例外などをキャッチするのが面倒なのですか?それはあなたがやりたいことにぴったりではありません。

SelectCommandプロパティは特別なことは何もしないことに注意することが重要です-SelectCommandが実行されても、渡されたコマンドはすべて実行されます-結果セットが返されることを期待し、結果が返されない場合は、空のデータセット。

これは、(とにかくこれを行う必要があります)ユーザーがクエリできるようにするテーブルにSELECT権限のみを明示的に付与する必要があることを意味します。

編集

他の質問に答えるために、SqlDataReaderReadOnly、読み取り専用のファイアホーススタイルのカーソルを介して機能するためです。これが効果的に意味することは次のとおりです。

while(reader.Read()) //Reads a row at a time moving forward through the resultset (`cursor`)
{
   //Allowed
   string name = reader.GetString(reader.GetOrdinal("name"));
   //Not Allowed - the read only bit means you can't update the results as you move through them
   reader.GetString(reader.GetOrdina("name")) = name;
}

レコードを移動するときにレコードを更新できないため、読み取り専用です。ただし、結果セットを取得するために実行するSQLがデータを更新できない理由はありません。

于 2012-09-21T11:52:41.020 に答える
0

読み取り専用の要件がある場合は、SQLデータベースに対するdb_datareader権限のみを持つアカウントを使用する接続文字列をTextBoxで使用するようにします。

そうでなければ、あなたのコントロールを消費している開発者がデータベースに接続し、SqlCommandをすべて自分で使用して大混乱を引き起こすのを止めているのは何ですか?

于 2012-09-21T11:58:22.093 に答える