VB.NET SqlException был необработан - PullRequest
0 голосов
/ 08 мая 2010

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

    Main.database.ExecuteCommand("UPDATE Contacts SET first_name='" + c.first_name + _
                              "', middle='" + c.middle + _
                              "', last_name='" + c.last_name + _
                              "', age='" + c.age + _
                              "', mobile_phone='" + c.mobile_phone + _
                              "', home_phone='" + c.home_phone + _
                              "', work_phone='" + c.work_phone + _
                              "', home_street='" + c.home_street + _
                              "', home_city='" + c.home_city + _
                              "', home_state='" + c.home_state + _
                              "', home_zip='" + c.home_zip + _
                              "', work_street='" + c.work_street + _
                              "', work_city='" + c.work_city + _
                              "', work_state='" + c.work_state + _
                              "', work_zip='" + c.work_zip + _
                              "', home_www='" + c.home_www + _
                              "', work_www='" + c.work_www + _
                              "', home_email='" + c.home_email + _
                              "', work_email='" + c.work_email + _
                              "' WHERE first_name='" + c.first_name + _
                              "' AND last_name='" + c.last_name + "'")

Я получаю следующую ошибку

Sql Исключение не было обработано

Типы данных text и varchar несовместимы в операторе равенства.


Я пытался пересмотреть код, используя параметры

            Using conn As New SqlConnection(), _
            myCommand As New SqlCommand("UPDATE Contacts SET" + _
                                        "first_name=@first_name" + _
                                        "AND middle=@middle" + _
                                        "AND last_name=@last_name" + _
                                        "AND age=@age" + _
                                        "AND mobile_phone=@mobile_phone" + _
                                        "AND home_phone=@home_phone" + _
                                        "AND work_phone=@work_phone" + _
                                        "AND home_street=@home_street" + _
                                        "AND home_city=@home_city" + _
                                        "AND home_state=@home_state" + _
                                        "AND home_zip=@home_zip" + _
                                        "AND work_street=@work_street" + _
                                        "AND work_city=@work_city" + _
                                        "AND work_state=@work_state" + _
                                        "AND work_zip=@work_zip" + _
                                        "AND home_www=@home_www" + _
                                        "AND work_www=@work_www" + _
                                        "AND home_email=@home_email" + _
                                        "AND work_email=@work_email" + _
                                        "WHERE first_name=@first_name" + _
                                        "AND last_name=@last_name", conn)

            myCommand.Parameters.Add(New SqlParameter("@first_name", c.first_name))
            myCommand.Parameters.Add(New SqlParameter("@middle", c.middle))
            myCommand.Parameters.Add(New SqlParameter("@last_name", c.last_name))
            myCommand.Parameters.Add(New SqlParameter("@age", c.age))
            myCommand.Parameters.Add(New SqlParameter("@mobile_phone", c.mobile_phone))
            myCommand.Parameters.Add(New SqlParameter("@home_phone", c.home_phone))
            myCommand.Parameters.Add(New SqlParameter("@work_phone", c.work_phone))
            myCommand.Parameters.Add(New SqlParameter("@home_street", c.home_street))
            myCommand.Parameters.Add(New SqlParameter("@home_city", c.home_city))
            myCommand.Parameters.Add(New SqlParameter("@home_state", c.home_state))
            myCommand.Parameters.Add(New SqlParameter("@home_zip", c.home_zip))
            myCommand.Parameters.Add(New SqlParameter("@work_street", c.work_street))
            myCommand.Parameters.Add(New SqlParameter("@work_city", c.work_city))
            myCommand.Parameters.Add(New SqlParameter("@work_state", c.work_state))
            myCommand.Parameters.Add(New SqlParameter("@work_zip", c.work_zip))
            myCommand.Parameters.Add(New SqlParameter("@home_www", c.home_www))
            myCommand.Parameters.Add(New SqlParameter("@work_www", c.work_www))
            myCommand.Parameters.Add(New SqlParameter("@home_email", c.home_email))
            myCommand.Parameters.Add(New SqlParameter("@work_email", c.work_email))

            conn.Open()

            myCommand.ExecuteNonQuery()

            conn.Close()

        End Using

Но у меня все еще есть проблема при инициализации соединения с этой ошибкой

Свойство ConnectionString не было инициализировано.

Ответы [ 3 ]

4 голосов
/ 08 мая 2010

Eeek!

Избавьтесь от динамического SQL!Это совершенно небезопасно.Вместо этого используйте параметризованные запросы !Вот небольшой пример:

Using conn As New SqlConnection(), _
      cmd As New SqlCommand("UPDATE Contacts SET first_name = @firstName", conn)
    conn.Open()
    cmd.Parameters.Add(new SqlParameter("firstName", c.first_name))
    cmd.ExecuteNonQuery()
End Using
2 голосов
/ 08 мая 2010

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

Я имею в виду.

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

Тип данных text на сервере sql означает внешний текст, поскольку в самой строке хранится только указатель на фактический текст. Сам текст хранится в совершенно другом месте. Это сделано для того, чтобы обойти ограничение размера строк в 8192 байта на сервере sql, и это означает, что вы не можете изменять или сравнивать поля типа text. Вы можете только извлечь или заменить данные в этих полях. Тип "текст" предназначен только для больших (> 1 КБ) текстовых полей.

0 голосов
/ 08 мая 2010

Все вышеперечисленное, параметризация обязательна, я обнаружил, что это замечательный практический совет http://www.sqlservercentral.com/articles/.Net/workingwithsqlparameterinnet/2311/


Один из моих приемов - сбросить строку и попробовать ее в окне запроса.,Интерфейс SQL Server будет напрямую указывать на код, вызывающий сбой.

...