2016-04-18 17 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

テーブル「ルーム」の列は何ですか? –

+0

あなたの値の1つは "big"というテキストですが、シングルクォートでテキスト値を折り返しているわけではないので、列名として解釈されるため、その列名が無効であると伝えられます。あなたは単なる引用符をあなたの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クエリ内に生のユーザ入力を直接入力しません。

そして、ちょうど明確にするには、ここでは、パラメータ化クエリを使用しての例です:

このコードを使用して
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の基本を使っています(私たちがコースにまだ到達していないので、何かparamterizedクエリが意味するものは分かりませんが、 )答えに感謝します! – xTMx

関連する問題