我对 DB 编程真的很陌生,我正在整理一个使用 ado.net 与 MS Access 数据库交互的小测试项目。我在网上四处寻找“最佳实践”的方法,但找不到我信任的最新答案。
我只想要通过 ado.net 插入访问数据库的“现代”方式,同时防止 SQL 注入攻击。如果还有什么我应该记住的,也请告诉我。
哦,顺便说一句,我知道有比 MS Access 更好的选择。但是,我在午休时间和其他东西的工作中这样做,我的雇主希望我不要用像这样的愚蠢的 DB 把 SQL 服务器空间弄得乱七八糟。
你可以试试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 对数字类型也非常挑剔。您需要确保您正在转换为完全正确的类型。