hareshdgr8 Ответов: 1

Проблема в течение некоторого времени вставить данные два раза с некоторым мини-сек. Разница в VB.NET


Привет,
У меня есть проблема, что иногда мои данные вставляются два раза в базу данных с разницей всего в мини-секунду, как
2020-02-18 17:05:15.533 &  2020-02-18 17:05:40.440 
с теми же клиентскими данными, но мой автоматически сгенерированный нет. быть другой

не могли бы вы объяснить, почему это происходит

Моя база данных-SQL SERVER 2012 EXPRESS ADDITION & FRONT END-VISUAL STUDIO 2010

Вышеуказанная проблема получает некоторое время & my database is in-network pc.

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

Мой код таков

sqlselect.CommandText = "insert into tableName(Auto_No,Auto_Type,Auto_Date,Log_By) values('" & strNo & "','NEW',SYSDATETIME(),1)"
                  sqlselect.ExecuteNonQuery()


Я ИСПОЛЬЗУЮ С ТРАНЗАКЦИЕЙ.

1 Ответов

Рейтинг:
11

OriginalGriff

Прежде чем пытаться исправить это, вам нужно изменить все ваше приложение: никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

Когда вы это сделаете, начните смотреть на вашу текущую проблему, если она все еще существует.
Но мы не можем помочь вам в этом: две временные разницы, которые вы показываете, разделены 25 секундами, поэтому вполне вероятно, что ваш код выполняется дважды в разное время - вам придется использовать отладчик, чтобы точно выяснить, что происходит, а затем начать думать о том, почему - и мы не можем сделать это за вас!
Но... если вы ожидаете, что "Auto_no" будет отличаться каждый раз, то вы определенно делаете это неправильно - вы не должны пытаться установить его в значение из вашего программного обеспечения для презентаций, вы должны позволить БД обрабатывать это - особенно с серверной системой, которая по своей сути является многопользовательской. Генерация его вне БД-это хороший способ получить некоторые действительно, очень неприятные прерывистые ошибки, которые могут мяукать всю вашу БД без надежды на восстановление. Вместо этого рассмотрите возможность использования поля идентификации.


hareshdgr8

сэр, для вашего вышеприведенного запроса я использую вот так SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'. Я использую двойную одинарную цитату вместо одной она автоматически заменит мое приложение так что не будет никаких проблем если кто-то передаст этот тип проблемы сэр любой другой намек или помощь вы можете пожалуйста предоставить мне его большую помощь мне ...

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

Жду, сэр..

OriginalGriff

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