2016-04-08 26 views
0

私はVB.NETを使用していて、SQLデータベースに接続するために使用していました。
は今、私は私のデータベースにデータを挿入したい、まだ私は私のコードを完了した後に、このエラーが出る:VB.NETコードで例外が発生する

A first chance exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll

それは意味ないと私は私のコードで間違って何をしますか?ここで

は私のコードです:

Imports System.Data.SqlClient 
Public Class AddNew 
Public con As New SqlConnection("Data Source=localhost;Initial Catalog=Tuition_Information;Integrated Security=True") 
Public cmd As New Data.SqlClient.SqlCommand 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Try 
     cmd.CommandType = System.Data.CommandType.Text 
     cmd.CommandText = "Insert Into Student_Info Value ('" & TextBox1.Text & "','" & TextBox2.Text & "','" & TextBox3.Text & "','" & TextBox4.Text & "','" & ComboBox1.SelectedValue & "','" & ComboBox2.SelectedValue & "','" & TextBox7.Text & "','" & TextBox8.Text & "')" 
     cmd.Connection = con 
     con.Open() 
     cmd.ExecuteNonQuery() 
     MsgBox("New Student Added", MsgBoxStyle.Information, "add") 

    Catch ex As Exception 
     MessageBox.Show("Error occured, please try again.") 
    End Try 

End Sub 

私のフォームは次のようになります。あなたがつもり

Database Table

+5

パラメータを使用しないと、SQLインジェクションの問題が発生します。 SelectedValueがnullでないと仮定すると、問題もあります。 VALUEではなくVALUESです。値リストと一致するようにフィールドリストを指定する方が常に安全です。 – LarsTech

+0

[学生登録](http://stackoverflow.com/q/332365/11683)、それは... – GSerg

+0

@LarsTechああ作品!どうもありがとうございます !!! –

答えて

2

:私のデータベースは、このようになります

Add New Form

もし、あなたはあなたがリストに載っているようにそれについて行きます。あなたがする必要があるのは、何らかの方法でクエリをパラメータ化することです。最も簡単な方法は、名前付きパラメータを使用してストアドプロシージャを作成することです。誰かの名前にアポストロフィが含まれている場合(そしてあなたにはO'Shannonなどがないとは言えません)、学生が既に登録されているときには説明していないため、これは爆発します。その学生の何かが、社会保障番号のように、それらをユニークにする必要がありますか?私はあなたが登録中に持っていると思いますか?その時点で

、あなたが何かを行うことができます:代わりにそのストアドプロシージャで

create procedure SaveStudent 
    @Student_Name nvarchar(128) , 
    @Home_Address nvarchar(256) , 
    @Contact_Number varchar(32) , 
    @Social_Security_Number char(11) 
    ... 
as 

set nocount on 
set rowcount 0 

if exists (select * from dbo.Students where Social_Security_Number = @Social_Security_Number) 
    begin 
     raiserror('Student with SSN %s already exists.', 16, 1, @Social_Security_Number) with nowait 
    end 
else 
    begin 
     insert into dbo.Students (
      Student_Name , 
      Home_Address , 
      Contact_Number , 
      Social_Security_Number , 
      ...) 
     select 
      @Student_Name , 
      @Home_Address , 
      @Contact_Number , 
      @Social_Security_Number , 
      ... 
    end 

go 

grant execute on SaveStudent to WhateverApplicationUserYouAreUsing 

を、あなたはそれらのパラメータをバインドすることができるだろう、とあなたは、悪意を持って入る誰かに対して脆弱ではないでしょうあなたがそれにアポストロフィを持つ名字を取得したときに、あなたは転倒しません。

明らかに、ストアドプロシージャにバインドする必要があります。これは、パラメータを準備することです。値は&です。しかし、あなたはより良い形になり、Little Bobby Tables問題に脆弱ではないでしょう。

+0

うわー、ありがとう! –

関連する問題