0

私は DB プログラミングの初心者で、ado.net を使用して MS Access データベースとやり取りする小さなテスト プロジェクトをまとめています。それを行うための「ベストプラクティス」の方法をオンラインで調べましたが、信頼できる最新の回答が見つかりませんでした。

SQLインジェクション攻撃を防ぎながら、ado.net経由でアクセスDBに挿入する「最新の」方法が欲しいだけです。他に気をつけなければならないことがあれば、それも教えてください。

ところで、MS Access よりも優れたオプションがあることは承知しています。しかし、私は職場で昼休みなどにこれを行っており、私の雇用主は、このようなばかげた DB で SQL サーバーのスペースを乱雑にしないことを望んでいます。

4

1 に答える 1

4

Dapperを試すことができます。これは、 IDbConnectionを実装するあらゆるものに対して任意の SQL を実行する方法であり、SQL インジェクション攻撃を回避し、きれいで最新のインターフェースを備えています。

OleDbCommand.Parameters.AddWithValue("fieldname", yourobj);それができない場合は、 (または同等の OdbcCommandを使用します。クエリには、パラメーター プレースホルダーとして疑問符を含める必要があります。Access の場合、次のように、フィールドが SQL クエリに表示されるのと同じ順序でパラメーター コレクションに引数を追加する必要があります。これ:

選択中

string sql = "select * from mytable where MyField LIKE ? and MyOtherField = ?";

// Dapper

using (OleDbConnection dbConn = new OleDbConnection("your connection string))
{
    dbConn.Open();
    var result = dbConn.Query(sql, new { MyField = "some value", MyOtherField = 3 });

    foreach (dynamic myrow in result)
    {
        // you can get at your table rows using myrow.MyField, myrow.SomeOtherField etc
        // To avoid myrow being dynamic, call dbConn.Query<T> where T is some type you 
        // define that matches your table definition
    }
}

// The "old-fashioned" way

using (OleDbConnection dbConn = new OleDbConnection("your connection string))
using (OleDbCommand dbCmd = dbConn.CreateCommand())
{
    dbConn.Open();
    dbCmd.CommandText = sql;
    dbCmd.Parameters.AddWithValue("MyField", "some value"));
    dbCmd.Parameters.AddWithValue("MyOtherField", 3));

    OleDbDataReader reader = dbCmd.ExecuteReader();
    while (reader.Read())
    {
        string myfield = reader["myfield"] == DBNull.Value ? null : (string)reader["myfield"];

        int SomeOtherField = reader["someotherfield"] == DBNull.Value ? 0 : (int)reader["someotherfield"];
    }
}

挿入

string sql = "insert into mytable (MyField, MyOtherField) values (?, ?)";

// Dapper

using (OleDbConnection dbConn = new OleDbConnection("your connection string))
{
    dbConn.Open();
    dbConn.Execute(sql, new { MyField = "some value", MyOtherField = 3 });
}

// The "old-fashioned" way

using (OleDbConnection dbConn = new OleDbConnection("your connection string))
using (OleDbCommand dbCmd = dbConn.CreateCommand())
{
    dbConn.Open();
    dbCmd.CommandText = sql;
    dbCmd.Parameters.AddWithValue("MyField", "some value"));
    dbCmd.Parameters.AddWithValue("MyOtherField", 3));

    dbCmd.ExecuteNonQuery(sql);
}

私の記憶が正しければ、オブジェクトからデータベースへ、またはデータベースからデータを移動するコードを作成するとき、Access は数値型にも非常にうるさいです。正確に正しい型との間でキャストしていることを確認する必要があります。

于 2012-07-24T15:02:14.787 に答える