DataTable внутренний индекс повреждается

Использование PDO и MYSQLi является хорошей практикой для предотвращения инъекций SQL, но если вы действительно хотите работать с функциями и запросами MySQL, было бы лучше использовать

mysql_real_escape_string

$unsafe_variable = mysql_real_escape_string($_POST['user_input']);

Есть больше возможностей для предотвращения этого: например, идентификация - если ввод представляет собой строку, число, символ или массив, есть так много встроенных функций для обнаружения этого. Кроме того, было бы лучше использовать эти функции для проверки входных данных.

is_string

$unsafe_variable = (is_string($_POST['user_input']) ? $_POST['user_input'] : '');

is_numeric

$unsafe_variable = (is_numeric($_POST['user_input']) ? $_POST['user_input'] : '');

И гораздо лучше использовать эти функции для проверки входных данных с помощью mysql_real_escape_string.

27
задан casperOne 9 August 2012 в 16:28
поделиться

4 ответа

не можете Вы просто использовать:

dtData.Columns.Add("TestColumn", typeof(Decimal), "Price * Quantity");
0
ответ дан balexandre 28 November 2019 в 05:20
поделиться

Мое понимание, от долгой и болезненной торговли по этой проблеме, то, что это - артефакт неориентированных на многопотоковое исполнение операций записи, которые обычно Вы не знали, что делали.

В моем случае, преступником, казалось, был BindingSource. Я нашел, что должен был приостановить привязку, выполнить любую операцию, которую я пробовал, и затем продолжите связывать, когда я был сделан, и проблема ушла. Это было 18 месяцев назад, таким образом, я больше не ясен в деталях, но я не забываю получать впечатление, что BindingSource делает некоторую операцию на своем собственном потоке. (Это имеет меньше смысла мне теперь, чем он сделал в то время.)

Другой потенциальный источник проблемы является событием DataTable's RowChanging. Если Вы делаете что-то, что изменяет таблицу в таком случае обработчик, ожидайте плохие вещи.

2
ответ дан Robert Rossney 28 November 2019 в 05:20
поделиться

Вы упоминаете "не ориентированный на многопотоковое исполнение". Вы управляете объектом от различных потоков? Раз так тогда это могло бы очень хорошо быть причиной повреждения.

3
ответ дан angry person 28 November 2019 в 05:20
поделиться

Лично, эта конкретная ошибка была моей Немезидой в течение 3 недель различными способами. Я решил его в одной части моей кодовой базы, и это обнаруживается в другом месте (я полагаю, что наконец раздавил его сегодня вечером). Информация об исключении довольно бесполезна, и способом вызвать переиндекс была бы хорошая функция, учитывая отсутствие MS для решения проблемы.

я не искал бы текущие исправления MS - они имеют статью KB о них, затем перенаправляют Вас к ASP.NET, фиксируют, который абсолютно не связан.

хорошо - достаточно жалобы. Давайте посмотрим то, что на самом деле помогло мне в решении этого конкретного вопроса в различных местах, я встретился с ним:

  • Избегают использования Представлений По умолчанию и изменения Представления По умолчанию, если это возможно. Btw.Net 2.0 имеет много читателей/устройств записи, соединяет представления создания, таким образом, они не проблема, они были пред 2,0.
  • Вызов AcceptChanges (), если это возможно.
  • Быть осторожным относительно.Select (выражение), с тех пор нет никакого читателя/устройства записи, привязывают этот код - и это - единственное место (по крайней мере, по словам человека в Usenet, так возьмите его w/мелкая частица соли - однако, это очень похоже на Вашу проблему - настолько использующие Взаимные исключения могут помочь)
  • Набор AllowDBNull к рассматриваемому столбцу (сомнительное значение, но сообщил относительно Usenet - я использовал его только в местах, где это имеет смысл)
  • , Удостоверяются, что Вы не устанавливаете пустой указатель (C#)/Nothing (VB) к полю DataRow. Используйте DBNull. Значение вместо пустого указателя. В Ваш случай можно хотеть проверить, что поле не является пустым, синтаксис выражения делает поддержки IsNull (val, alt_val) оператор.
  • Это, вероятно, помогло мне большинство (абсурдный, поскольку это звучит): Если значение не изменяется, не присваивайте его. Таким образом в Ваш использование случая это вместо Вашего прямого присвоения:

    , если (столбец. Выражение! = "некоторое выражение") столбец. Выражение = "некоторое выражение";

(я удалил квадратные скобки, не уверенные, почему они были там).

Редактирование (5/16/12): Просто сталкивался с этой проблемой неоднократно (с UltraGrid/UltraWinGrid). Используемый совет удаления вида на DataView, и затем добавил отсортированный столбец, который соответствовал виду DataView, и это решило вопрос.

10
ответ дан torial 28 November 2019 в 05:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: