我正在执行插入功能,允许管理员为课堂预订目的创建时间段。列将是房间,时间和日期。如果我想防止重复插入数据?
例如:房间1,1pm,2014年7月12日可以插入两次。 我可以包含哪种查询来防止它? 这是我的代码: Dim con As New SqlConnection
Dim cmd As New SqlCommand
con.ConnectionString =
con.Open()
cmd.Connection = con
cmd.CommandText = "INSERT INTO [Room] ([room],[time],[date]) VALUES('" & ComboBox1.Text & "','" & ComboBox2.Text & "','" & DateTimePicker1.Text & "' )"
cmd.ExecuteNonQuery()
MsgBox("Classroom and time is opened for student to book!")
con.Close()
答案 0 :(得分:1)
您可以像这样使用MERGE T-SQL命令查询。 (Sql Server 2008)
cmd.CommandText = "MERGE INTO Room as Target " & _
"USING (SELECT @rm as r, @tm as t, @dt as d) as Source " & _
"ON Target.Room = Source.r AND Target.[time] = Source.t AND Target.[date] = Source.d " & _
"WHEN NOT MATCHED THEN " & _
"INSERT ([room],[time],[date]) VALUES (@rm, @tm, @dt);"
此查询在Room表中搜索输入与已存在记录之间的完全匹配。如果没有匹配则执行插入。如果有匹配则没有做任何事情。
如您所见,此查询不使用字符串连接作为上面的示例。因此,您还需要更改代码以使用参数化查询
cmd.Parameters.AddWithValue("@rm", ComboBox1.Text)
cmd.Parameters.AddWithValue("@tm", ComboBox2.Text)
cmd.Parameters.AddWithValue("@dt", DateTimePicker1.Text)
Dim rowInserted = cmd.ExecuteNonQuery()
If rowInserted > 0 Then
MessageBox.Show("Row inserted")
else
MessageBox.Show("Already booked")
End If
但这种做法引出了另一个问题
您确定自己的字段Time
和Date
(我建议更改这些名称)是NVARCHAR还是其他文字类型?。
它们似乎是DateTime,因此您需要传递具有适当日期类型的参数。