2016-05-27 7 views
-1

mySqlデータベースにドロップダウンリストの値を挿入する際に問題があります。 "INSERT文には、VALUES句で指定された値よりも少ない列があります。VALUES句の値の数は、INSERT文で指定された列の数と一致する必要があります。データベースへの挿入に関する問題(asp.net、vb.net)

1つのドロップダウンリストから値2を選択し、2番目のドロップダウンリストも同じ番号を選択すると、問題なく挿入されます。値が違う(互いに等しくない)場合、それは私にその問題を与えます。

Imports System.Data 
Imports System.Data.SqlClient 

Partial Class Bevestiging 
Inherits System.Web.UI.Page 
Dim con As New SqlConnection(" server=BOYAN\SQLEXPRESS; Initial Catalog=GipDatabase; User ID=sa; Password=DitIs1SuperGoedW8woord!") 
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load 

LblFilmnaam.Text = Session("filmnaam") 
LblDatum.Text = Session("datum") 
Lbltijd.Text = Session("tijd") 
LblAantalKin.Text = Session("Aantalkin") 
LblAantalVol.Text = Session("AantalVol") 
LblTypeZaal.Text = Session("Zaaltype") 
LblPrijs.Text = Session("prijs") 
End Sub 

Protected Sub BtnBevestigen_Click(sender As Object, e As EventArgs) Handles BtnBevestigen.Click 
Dim cmd As New SqlCommand() 
cmd.Connection = con 
cmd.CommandType = CommandType.Text 
con.Open() 
cmd.CommandText = "insert into TblReserveren(Filmnaam,datum, tijd, Aantalvolwassenen, Aantalkinderen, TypeZaal, Prijs, GebruikerID) Values('" + LblFilmnaam.Text.ToString + "','" + LblDatum.Text + "','" + Lbltijd.Text + "','" + LblAantalVol.Text + "','" + LblAantalKin.Text + "', '" + LblTypeZaal.Text + "', " + LblPrijs.Text + " , (Select ID from TblGebruiker Where Username = '" + Session("Username") + "'))" 

cmd.ExecuteNonQuery() 
'MessageBox("De film Is gereserveerd!") 
'Response.Write("De film Is gereserveerd!") 
con.Close() 
End Sub 
End Class 
+2

まず、[Option Strict On](https://msdn.microsoft.com/en-us/library/zcd4xwzs.aspx)を有効にして、それが指摘する問題を修正する必要があります。次に、* SQLパラメータ*の使用方法を調べて、それらをクエリに使用する必要があります.SQLインジェクション攻撃に対してより安全で、アポストロフィを使用してデータを処理します。 –

+0

動的SQLを生成するのではなく、実際に変数をバインドする必要があります。また、小数点記号としてカンマを使用していますか? –

+0

表示されているコードにドロップダウンリストはありません。 –

答えて

0

クエリにSQLパラメータを使用する必要があります。データのアポストロフィのような文字の問題を回避し、SQLインジェクション攻撃を防止し、実行計画を再利用できるようにすることでパフォーマンスを向上させることができます(これは常に問題ではありません)。

また、Using構文を使用すると、アンマネージリソース(What is meant by “managed” vs “unmanaged” resources in .NET?)は(クラスが.Dispose()メソッドを持っているならば、あなたはそれにUsingまたはコール.Dispose()を使用する必要があります)あなたのために正しく処分されることを確認します。

だから、あなたのコードは次のようになります。

Using con As New SqlConnection("server=BOYAN\SQLEXPRESS; Initial Catalog=GipDatabase; Integrated Security=true;") 
    Dim sql = "INSERT INTO TblReserveren(Filmnaam,datum, tijd, Aantalvolwassenen, Aantalkinderen, TypeZaal, Prijs, GebruikerID) Values(@Filmnaam, @datum, @tijd, @Aantalvolwassenen, @Aantalkinderen, @TypeZaal, @prijs, (SELECT ID FROM TblGebruiker WHERE Username = @Username))" 
    Using cmd As New SqlCommand(sql, con) 

     'TODO: Set the .SqlDbType and .Size to match the columns in the database. ' 
     cmd.Parameters.Add(New SqlParameter With {.ParameterName = "@Filmnaam", .SqlDbType = SqlDbType.NVarChar, .Size = 100, .Value = CStr(Session("filmnaam"))}) 
     cmd.Parameters.Add(New SqlParameter With {.ParameterName = "@datum", .SqlDbType = SqlDbType.DateTime, .Value = CDate(Session("datum"))}) 
     cmd.Parameters.Add(New SqlParameter With {.ParameterName = "@tijd", .SqlDbType = SqlDbType.NVarChar, .Size = 100, .Value = CStr(Session("tijd"))}) 
     cmd.Parameters.Add(New SqlParameter With {.ParameterName = "@Aantalvolwassenen", .SqlDbType = SqlDbType.NVarChar, .Size = 100, .Value = CStr(Session("AantalVol"))}) 
     cmd.Parameters.Add(New SqlParameter With {.ParameterName = "@Aantalkinderen", .SqlDbType = SqlDbType.NVarChar, .Size = 100, .Value = CStr(Session("Aantalkin"))}) 
     cmd.Parameters.Add(New SqlParameter With {.ParameterName = "@TypeZaal", .SqlDbType = SqlDbType.NVarChar, .Size = 100, .Value = CStr(Session("Zaaltype"))}) 
     cmd.Parameters.Add(New SqlParameter With {.ParameterName = "@prijs", .SqlDbType = SqlDbType.Decimal, .Value = CDec(Session("prijs"))}) 
     cmd.Parameters.Add(New SqlParameter With {.ParameterName = "@Username", .SqlDbType = SqlDbType.NVarChar, .Size = 100, .Value = CStr(Session("Username"))}) 

     con.Open() 
     cmd.ExecuteNonQuery() 
     con.Close() 
    End Using 
End Using 

私は「データム」は日を意味していることを想定し、「prijsは」価格です。価格は、通常、小数点以下の値として格納する必要があります。

セッション変数にデータが表示されているように、テキストボックスからデータを取得する代わりに、それらを使用しました。悪意のあるユーザーがウェブサイトを攻撃する際にデータを変更する可能性を最小限に抑えたいとします。

データベースにある列の型が定義されているかどうかわかりません。そのため、データベース定義と一致するようにパラメータを調整してください。

最後に、はありませんウェブ関連の作業には「sa」ログインを使用しないでください。 "Integrated Security = true"設定を使用することをお勧めします。アプリケーションで使用されるアプリケーションプールのIDにSQL Serverの一部のアクセス許可を与える必要がある場合があります。

関連する問題