我有一个OleDbCommand用于我尝试实现的插入,以避免SQL注入。在此之前,我用简单的字符串进行查询,而我不喜欢那样。现在,我对插入记录的代码看起来是这样的:找出哪个查询导致了一个异常
try
{
OleDbConnection rConn = new OleDbConnection(args[3]);
rConn.Open();
using (OleDbCommand insert = new OleDbCommand(String.Format(Globals.QUERY_INSERT_CLICK, args[4]), rConn))
{
insert.Parameters.Add("id", OleDbType.BigInt, 20);
insert.Parameters.Add("email", OleDbType.VarChar, 255);
insert.Parameters.Add("clickTime", OleDbType.Date, 20);
insert.Parameters.Add("subscriberId", OleDbType.BigInt, 20);
insert.Parameters.Add("link", OleDbType.VarChar, 255);
insert.Parameters.Add("sendQueueId", OleDbType.BigInt, 20);
insert.Parameters.Add("mailingListName", OleDbType.VarChar, 255);
insert.Parameters.Add("newsletterId", OleDbType.BigInt, 20);
insert.Parameters.Add("sendDate", OleDbType.Date, 20);
insert.Parameters[0].Value = clickitem.Id;
insert.Parameters[1].Value = clickitem.Email;
insert.Parameters[2].Value = clickitem.ClickTime;
insert.Parameters[3].Value = clickitem.SubscriberId;
insert.Parameters[4].Value = clickitem.Link;
insert.Parameters[5].Value = clickitem.SendQueueId;
insert.Parameters[6].Value = mailingListName;
insert.Parameters[7].Value = newsletterID;
insert.Parameters[8].Value = sendDate;
insert.Prepare();
insert.ExecuteNonQuery();
}
rConn.Close();
}
catch (OleDbException oldbex)
{
logger.WriteToLog("GETCLICKS", "OleDbException: " + Globals.ERROR_INSERT_CLICK + oldbex.Message);
}
catch (Exception ex)
{
logger.WriteToLog("GETCLICKS", Globals.ERROR_INSERT_CLICK + ex.Message);
}
我有成千上万刀片和我从我的日志,其中一些不正确插入看到。例外告诉我,例如不能从bigint转换为datetime和类似的东西。虽然我的大部分记录都正确插入,但我想知道哪些插入查询确实导致了错误。我怎么弄出来的?
N.B.在使用此方法之前,我有权访问我的查询字符串,并立即发现错误。现在我想我对SQL注入的免疫力造成了一些困惑
在你的'catch'只是注销参数,就像你以前注销你的SQL字符串一样。 – 2013-04-08 15:10:40
注意,如果'args [4]'可能受到用户的影响,则此代码仍然容易受到SQL注入的影响。 – tomfanning 2013-04-08 15:20:01
您可能会发现使用'OleDbParameterCollection.AddWithValue()'可以更轻松地进行操作,而不需要您指定参数类型或长度。 http://msdn.microsoft。com/en-us/library/system.data.oledb.oledbparametercollection.addwithvalue(v = vs.100).aspx – tomfanning 2013-04-08 15:21:43