2016-04-18 51 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的適當位置,但這是一個bandaid措施。正如@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 & ")" 

但要強調的重要性(除其他事項外)的安全性,使用參數化問題1而不是原始用戶直接在SQL查詢中輸入。

而只是爲了澄清,在這裏與參數化查詢的例子:

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