繁体   English   中英

通过ADO.net安全地插入MS Access DB

[英]Inserting into MS Access DB safely via ADO.net

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

我只希望“现代”方式通过ado.net插入到Access DB中,同时防止SQL注入攻击。 如果还有其他需要牢记的地方,也请告诉我。

哦,顺便说一下,我知道有比MS Access更好的选择。 但是,我在午餐时间和其他东西上工作,而我的雇主希望我不要用这样的愚蠢的DB弄乱SQL Server空间。

您可以尝试Dapper 这是一种对任何实现IDbConnection的对象执行任意SQL的方式,该方式可以避免SQL注入攻击并具有美观,干净,现代的界面。

如果失败,则只需使用OleDbCommand.Parameters.AddWithValue("fieldname", yourobj); (或等效的OdbcCommand。您的查询将需要包含问号作为参数占位符。对于Access,您需要按照与S​​QL查询中出现的字段相同的顺序将参数添加到参数集合中,如下所示:

选择

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

如果我没记错的话,在编写将数据从对象移动到数据库以及从数据库移动到数据库的代码时,访问对数字类型也非常挑剔。 您需要确保要在正确的类型之间进行强制转换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM