2016-04-18 7 views
1

Я пытаюсь взять данные, введенные пользователем из формы, и вставить их в таблицу в базе данных Проблема в том, что всякий раз, когда компилятор достигает переменной Rtype чтобы сохранить его значение, он дает мне эту ошибку: Found in the image link Я знаю, что означает ошибка, но я просто не могу заставить ее работать. Ниже мой код в классе Form1Вставка данных в базу данных (sqlexception) не работает

Imports System.Data.SqlClient 

Public Class Form1` 

    Private Sub newBtn_Click(sender As Object, e As EventArgs) Handles BtnNwRoom.Click 
     Dim obj As New Hotl() 
     Dim selectedItem As Object 
     selectedItem = hotelCombobox.SelectedItem() 
     If (obj.addnew(CInt(Me.roomNum.Text), CInt(selectedItem), Me.roomType.Text, Me.price.Text) = False) Then 
      MsgBox(" no record is added, Try again later") 
     End If 
    End Sub 
End class 

Это добавить новую функцию:

 Public Function addnew(ByVal roomNo As Integer, ByVal hotelNo As String, ByVal RoomType As String, ByVal price As Integer) As Boolean 

     Dim sqlstmnt = "insert into Room (roomNo,hotelNo,RoomType,price) values(" & roomNo & " , " & hotelNo & " , " & RoomType & " , " & price & ")" 
     MsgBox(sqlstmnt) 
     conn = ConNew() 
     '''''''''''''''''''''''''''''' Execute Reader 
     '''''''''''''''''''''''''''''''''''''''''''''' 

     Dim command As New SqlCommand(sqlstmnt, conn) 
     If command.ExecuteNonQuery() = 1 Then 
      MessageBox.Show("insertion Succeded") 
      Return True 
     Else 
      Return False 
     End If 
    End Function 
+0

Используйте параметры sql, которые, вероятно, разрешат эту проблему и, что еще важнее, - ваша неотъемлемая уязвимость в SQL-инъекции. –

+0

Каковы столбцы в таблице 'Room'? –

+0

Одним из ваших значений является текст «большой», но вы не обмениваете текстовые значения в одинарные кавычки, поэтому его интерпретируют как имя столбца, поэтому вам говорят, что это имя столбца недействительно. Вы могли бы просто поместить одинарные кавычки в нужные места в вашем SQL, но это мера бандаи. Делайте это правильно с параметрами, как предлагает @TimSchmelter. См. Здесь: http://jmcilhinney.blogspot.com.au/2009/08/using-parameters-in-adonet.html – jmcilhinney

ответ

1

Как сказал Тим, использование параметризованных запросов вместо этого.

Но, основная причина вашей проблемы здесь:

RoomType As String 

     Dim sqlstmnt = "insert into Room (roomNo,hotelNo,RoomType,price) values(" & roomNo & " , " & hotelNo & 
" , " & RoomType & " , " & price & ")" 

RoomType определяются как строка, но у вас нет ограждающих апострофа в запросе (следовательно, оно будет интерпретировано как числовые или имя ., а не строка

Таким образом, в данном конкретном случае, используйте:

Dim sqlstmnt = "insert into Room (roomNo,hotelNo,RoomType,price) values(" & roomNo & " , " & hotelNo & 
    " , '" & RoomType & "' , " & price & ")" 

Но чтобы подчеркнуть важность (среди прочего) безопасности, используйте параметризированный questi вместо этого, а не сырой пользовательский ввод непосредственно в SQL Query.

И только уточнить, вот пример с параметризованным запроса:

Public Function addnew(ByVal roomNo As Integer, ByVal hotelNo As String, ByVal RoomType As String, ByVal price As Integer) As Boolean 
    Dim sqlstmnt As String = "INSERT INTO ROOM (roomNo,hotelNo,RoomType,price) VALUES(@roomNo, @hotelNo, @RoomType, @price)" 
    MsgBox(sqlstmnt) 
    conn = ConNew() 
    '''''''''''''''''''''''''''''' Execute Reader 
    '''''''''''''''''''''''''''''''''''''''''''''' 

    Dim command As New SqlCommand(sqlstmnt, conn) 
    command.Parameters.Add("@roomNo",SqlDbType.Int).Value = roomNo 
    command.Parameters.Add("@hotelNo",SqlDbType.Int).Value = hotelNo 
    command.Parameters.Add("@RoomType",SqlDbType.NVarChar,50).Value = RoomType 
    command.Parameters.Add("@price",SqlDbType.Int).Value = price 

    If command.ExecuteNonQuery() = 1 Then 
     MessageBox.Show("insertion Succeded") 
     Return True 
    Else 
     Return False 
    End If 
End Function 

Используя этот код вы защищены от SQL-инъекций и не придется столкнуться с непредвиденным проблем для использования зарезервированных слов, и т.д.

+1

Основная причина в том, что он не использует параметризованные запросы. Он не должен заботиться о включении апострофов, не показывать ему, как он может скрыть свою главную проблему, которая является уязвимостью в sql-инъекции;) –

+1

Он попытался подчеркнуть важность использования параметризованных запросов, но все же полезно помочь людям получить понимание того, что они делают, и то, что они сделали неправильно (синтаксически) в своем первоначальном вопросе. :) – JaggenSWE

+0

Я только недавно начал изучать vb.net, и я просто использую основы vb (я не знаю, что означают термитизированные запросы, потому что мы еще не достигли их в нашем курсе, но я буду читать о них) .Спасибо за ответ! – xTMx

 Смежные вопросы

  • Нет связанных вопросов^_^