我是DB编程的新手,我正在整理一个使用ado.net与MS Access数据库交互的小测试项目。我在网上浏览了“最佳实践”方法,但无法找到我信任的最新答案。
我只想通过ado.net插入访问数据库的“现代”方式,同时防止SQL注入攻击。如果还有其他什么我应该记住,请告诉我。
哦,顺便说一句,我知道有比MS Access更好的选择。但是,我正在午餐休息和工作中这样做,我的雇主更希望我不会像这样愚蠢的DB混乱SQL服务器空间。
答案 0 :(得分:4)
您可以尝试Dapper。这是一种以避免SQL注入攻击并且具有漂亮,干净,现代的界面的方式对任何实现IDbConnection的任何内容执行任意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);
}
如果我没记错的话,在编写将数据从对象移入和移出数据库的代码时,访问对于数字类型也非常挑剔。你需要确保你正在使用正确的类型。