Использование PDO и MYSQLi является хорошей практикой для предотвращения инъекций SQL, но если вы действительно хотите работать с функциями и запросами MySQL, было бы лучше использовать
$unsafe_variable = mysql_real_escape_string($_POST['user_input']);
Есть больше возможностей для предотвращения этого: например, идентификация - если ввод представляет собой строку, число, символ или массив, есть так много встроенных функций для обнаружения этого. Кроме того, было бы лучше использовать эти функции для проверки входных данных.
$unsafe_variable = (is_string($_POST['user_input']) ? $_POST['user_input'] : '');
$unsafe_variable = (is_numeric($_POST['user_input']) ? $_POST['user_input'] : '');
И гораздо лучше использовать эти функции для проверки входных данных с помощью mysql_real_escape_string
.
не можете Вы просто использовать:
dtData.Columns.Add("TestColumn", typeof(Decimal), "Price * Quantity");
Мое понимание, от долгой и болезненной торговли по этой проблеме, то, что это - артефакт неориентированных на многопотоковое исполнение операций записи, которые обычно Вы не знали, что делали.
В моем случае, преступником, казалось, был BindingSource. Я нашел, что должен был приостановить привязку, выполнить любую операцию, которую я пробовал, и затем продолжите связывать, когда я был сделан, и проблема ушла. Это было 18 месяцев назад, таким образом, я больше не ясен в деталях, но я не забываю получать впечатление, что BindingSource делает некоторую операцию на своем собственном потоке. (Это имеет меньше смысла мне теперь, чем он сделал в то время.)
Другой потенциальный источник проблемы является событием DataTable's RowChanging. Если Вы делаете что-то, что изменяет таблицу в таком случае обработчик, ожидайте плохие вещи.
Вы упоминаете "не ориентированный на многопотоковое исполнение". Вы управляете объектом от различных потоков? Раз так тогда это могло бы очень хорошо быть причиной повреждения.
Лично, эта конкретная ошибка была моей Немезидой в течение 3 недель различными способами. Я решил его в одной части моей кодовой базы, и это обнаруживается в другом месте (я полагаю, что наконец раздавил его сегодня вечером). Информация об исключении довольно бесполезна, и способом вызвать переиндекс была бы хорошая функция, учитывая отсутствие MS для решения проблемы.
я не искал бы текущие исправления MS - они имеют статью KB о них, затем перенаправляют Вас к ASP.NET, фиксируют, который абсолютно не связан.
хорошо - достаточно жалобы. Давайте посмотрим то, что на самом деле помогло мне в решении этого конкретного вопроса в различных местах, я встретился с ним:
Это, вероятно, помогло мне большинство (абсурдный, поскольку это звучит): Если значение не изменяется, не присваивайте его. Таким образом в Ваш использование случая это вместо Вашего прямого присвоения:
, если (столбец. Выражение! = "некоторое выражение") столбец. Выражение = "некоторое выражение";
(я удалил квадратные скобки, не уверенные, почему они были там).
Редактирование (5/16/12): Просто сталкивался с этой проблемой неоднократно (с UltraGrid/UltraWinGrid). Используемый совет удаления вида на DataView, и затем добавил отсортированный столбец, который соответствовал виду DataView, и это решило вопрос.