yogeshysankar Ответов: 1

При выполнении запроса insert с помощью odbccommand.executenonquery он возвращает ошибку ссылки на объект , но данные вставляются в таблицу


Привет,

Я попытался выполнить операцию вставки с помощью odbccommand.executenonquery
он возвращает ошибку ссылки на объект в то же время он вставляет запись в таблицу

в чем причина исключения ?

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

Dim cmd as OdbcCommand

cmd = new odbcCommand (s_sql, Con) 

 If Cnn.State = ConnectionState.Closed Then Cnn.Open()

  cmd.ExecuteNonQuery()

cmd.dispose() 

1 Ответов

Рейтинг:
2

OriginalGriff

Мы не можем сказать из этого фрагмента: у нас нет доступа к вашей БД, данным, которые вы передаете, или остальной части вашего кода.

Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Если вы не знаете, как его использовать, то быстрый Google для "Visual Studio debugger" должен дать вам необходимую информацию.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!

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

Никогда не объединяйте строки для построения команды 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;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

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


yogeshysankar

@OriginalGriff я занимаюсь отладкой. Во время отладки, где в то время было выброшено исключение, я скопировал этот запрос и попытался выполнить его в sql express, но запрос отлично выполняется в sql express, нет никаких проблем с запросом.
У меня вопрос, когда я использую команду.метод executenonquery иногда исключения все-таки сделать запрос выполнить , записи вставляются в таблицу тогда почему ошибка objectreference происходит??

OriginalGriff

Ошибка ссылки на объект исходит не из SQL, а откуда - то из вашего кода C#, и отладчик показывает вам точную строку, в которой она произошла. Затем вам нужно посмотреть на объекты eteh в этой строке и узнать, какие именно из них являются нулевыми и вызывают обнаружение ошибки. Затем вы используете отладчик, чтобы узнать, почему он равен null, когда вы не думали, что это должно быть так.

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

yogeshysankar

спасибо за ответ.. Ошибка возникает в строке cmd.executeNonQuery, где соединение не равно null и cmd также не равно null, я это проверил . Я использую одно соединение через проект out . К сожалению, я не могу предоставить свою официальную базу данных. Я просто хочу знать все возможности . Но как это произойдет ошибка и вставка одновременно, потому что запись будет вставлена ??