0

我对 DB 编程真的很陌生,我正在整理一个使用 ado.net 与 MS Access 数据库交互的小测试项目。我在网上四处寻找“最佳实践”的方法,但找不到我信任的最新答案。

我只想要通过 ado.net 插入访问数据库的“现代”方式,同时防止 SQL 注入攻击。如果还有什么我应该记住的,也请告诉我。

哦,顺便说一句,我知道有比 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 回答