我在做VB.NET并用它来连接我的SQL数据库 现在我想将数据插入到我的数据库中,但在我完成代码之后出现了这个错误:
类型' System.Data.SqlClient.SqlException'的第一次机会异常。发生在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
我的表格如下:
我的数据库看起来像这样:
答案 0 :(得分:2)
如果你按照上市的方式去做,你会把事情搞砸。您需要做的是以某种方式参数化查询 - 最简单的方法是创建具有命名参数的存储过程。我说这会爆炸,因为你没有考虑到某个人的名字包含撇号的情况(你不能告诉我你不会有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问题的影响。