我有一個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