Miguel Altamirano Morales Ответов: 1

Решить ошибку 3113 SQL server


Всем добрый день.

Я пытаюсь обновить таблицу SQL Server из приложения Access с помощью VBA.

Это код VBA:

Querie = "обновление dbo_pedidos_ventas набор фактуры =" &амп; функция cstr(Фолио) и усилитель; amp; ", ClaveUbicacionAnt = '" &амп; strClave &ампер; "' где Id_pedido = " &амп; функция cstr(NumPedido)
DoCmd.RunSQL (Querie)

Переменные "folio" (числовые) и "strClave" (строковые) содержат значения, которые мне нужно зарегистрировать, каждое из которых находится в соответствующем поле.

Когда инструкция запускается, она посылает мне сообщение об ошибке 3113 "не удается обновить claveubicacionant; поле не обновляется".

Конфликтующее поле имеет тип varchar(2), и я пытаюсь присвоить ему двухсимвольную строку.

Я буду очень признателен за любую помощь, которую кто-нибудь может дать, или за подсказку, где искать ответ.

Исправление: вопрос должен был звучать так: "как я могу установить обновляемое конкретное поле в таблице SQL Server ?"

Большое спасибо.

Что я уже пробовал:

Я искал ответ в интернете, и я собираюсь продолжать пытаться.

RedDk

VBA ... и ... SQL

Пожалуйста, отредактируйте свой пост и включите соответствующие теги. VBA, кстати ... о, забудь об этом. Я ухожу.

1 Ответов

Рейтинг:
9

Patrice T

Из-за того, как вы строите запрос, мы не можем знать, что это на самом деле за запрос.
Измените свой код, чтобы распечатать запрос, или используйте отладчик, чтобы увидеть его.
Когда вы его получили, попробуйте обновить вопрос.

Querie = "UPDATE dbo_pedidos_ventas SET Factura = " & CStr(folio) & ", ClaveUbicacionAnt = '" & strClave & "' WHERE Id_pedido = " & CStr(NumPedido)

у вас есть еще одна проблема.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]


Miguel Altamirano Morales

Большое спасибо ppolymorphe.

На самом деле я уже читал о SQL-инъекции, но ваш комментарий стоит принять во внимание.

В данном конкретном случае я могу заверить вас, что это невозможно; это настольное приложение, и значения берутся из полей со списком, пользователь не может вводить данные вручную, а только выбирать их из доступных списков.

Я думаю, что мой ответ не объяснен должным образом, поэтому я собираюсь его исправить.


Единственный вопрос должен быть: как я могу сделать обновляемым поле в таблице SQL Server ?

Dave Kreskowiak

Проблема с тем, как вы строите запрос, заключается в том, что это затрудняет отладку кода и облегчает ввод данных пользователем, чтобы превратить ваш оператор SQL в синтаксическую ошибку. Используйте параметризованные запросы, и эта проблема исчезнет.

Miguel Altamirano Morales

Большое вам спасибо, Дэйв; дело в том, что я использую VBA, и сначала мне нужно посмотреть, принимает ли этот язык параметризованные запросы. (Эта система уже создана).

Я даже попытался обновить это конкретное поле с помощью набора записей и старомодной функции двигателя реактивного двигателя Recordset.edit и recordset.update; одно из полей правильно обновлено, но не то, с которым возникла проблема, и сообщение об ошибке одно и то же; это похоже на то, если приложение не распознает это поле.
Завтра я попытаюсь обновить это поле с помощью SQL-запроса внутри устройства управления SQL или вручную, чтобы проверить, правильно ли оно работает. Если это не так, Я собираюсь удалить это поле и попытаться использовать новую связанную таблицу.

Спасибо, Дэйв.

Patrice T

- Сначала я должен проверить, принимает ли этот язык параметризованные запросы.
VBA принимает их, поскольку они обязательны для хранимых процедур.

Dave Kreskowiak

Это не имеет никакого отношения к полю вообще. Если запрос работает для обновления одного поля для одной записи, он будет работать для одного и того же поля во всех записях таблицы.

Проблема будет сводиться к данным, которые поступают в поле. Символы в этом поле путают оператор SQL, вероятно, потому, что где-то в нем есть символ Апострофа ('). Параметризованные запросы позаботятся об этой ситуации и других для вас.

Miguel Altamirano Morales

Большое вам спасибо, ребята, предложения, которые вы мне дали, очень ценны, и я уже решил свою проблему.

Увидимся !!!