У меня есть 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 и тому подобное. Хотя большинство моих записей вставляются правильно, я хочу знать, какой именно из этих запросов на вставку вызвал ошибку. Как я могу это понять?
Н.Б. Перед использованием этого метода у меня был доступ к моей строке запроса, и я сразу же обнаружил ошибку. Теперь я думаю, что мой иммунитет к SQL-инъекциям вызывает у меня некоторое замешательство.
catch
просто выведите из системы параметры так же, как ранее вы выходили из своей строки SQL. - person RB.   schedule 08.04.2013args[4]
, этот код по-прежнему уязвим для SQL-инъекций. - person tomfanning   schedule 08.04.2013OleDbParameterCollection.AddWithValue()
, который не требует указания типа или длины параметра. msdn.microsoft .com/en-us/library/ - person tomfanning   schedule 08.04.2013