【问题标题】:prevent insert repeated data record(3column as 1 record) -vb.net防止插入重复数据记录(3列作为1条记录)-vb.net
【发布时间】:2014-11-12 01:13:10
【问题描述】:

我正在做一个插入功能,它允许管理员为课堂预订目的创建时间段。该列将是房间、时间和日期。如果我想防止重复插入数据怎么办?

例如:房间 1,1pm, 12 July 2014 可以插入两次。 我可以包括什么样的查询来防止它? 这是我的代码:

    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()

【问题讨论】:

  • 首先执行SELECT 语句以检查表中是否有匹配日期时间和房间组合的行。如果返回的行数大于零,则不要继续插入
  • 对不起,是我的错。

标签: vb.net visual-studio sqlcommand


【解决方案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

但这种方法会引出另一个问题。
您确定您的字段 TimeDate(我建议更改这些名称)是 NVARCHAR 或其他文本类型吗?
它们似乎是 DateTime,因此您需要传递具有适当日期类型的参数。

【讨论】:

  • 我对所有三个字段都使用了 varchar。你能解释一下如何在我的查询中实现参数以及它是如何工作的吗?我不明白这个 int rowInserted = cmd.ExecuteNonQuery() if(rowInserted > 0)
  • 没什么特别的。在您的 sql 文本中,您放置了一个充当占位符 (@xxxx) 的字符串,而不是值。用于执行文本的 SqlCommand 需要为每个占位符填充一个 SqlParameter 参数集合。我使用了 AddWithValue 方法,但许多构造函数有助于更具体。当您使用参数化查询时,占位符与集合和 subst 中使用的相应值相匹配。这消除了在值周围加上引号并避免 Sql 注入攻击的需要。
  • cmd.CommandText = "INSERT INTO [Room] ([room],[time],[date]) VALUES('" & ComboBox1.Text & "','" & ComboBox2.Text & "','" & DateTimePicker1.Text & "')" cmd.Parameters.AddWithValue("@rm", ComboBox1.Text) cmd.Parameters.AddWithValue("@tm", ComboBox2.Text) cmd.Parameters.AddWithValue( "@dt", DateTimePicker1.Text) Int(rowinserted = cmd.ExecuteNonQuery()) If (rowinserted > 0) Then MessageBox.Show("插入行") Else MessageBox.Show("已经预订") End If con.Close () 我做对了吗?
  • 不,这仍然有字符串连接部分。 VALUES(@rm,@tm,@dt),关于 rowinserted,它只是 ExecuteNonQuery 的返回值。如果查询插入/更新/删除行,您会在此处看到这些行的计数已更改。零表示没有行被更改/插入/删除。
  • cmd.CommandText = "INSERT INTO [Room] ([room],[time],[date]) VALUES(@rm,@tm,@dt)" cmd.Parameters.AddWithValue(" @rm", ComboBox1.Text) cmd.Parameters.AddWithValue("@tm", ComboBox2.Text) cmd.Parameters.AddWithValue("@dt", DateTimePicker1.Text) Int(a = cmd.ExecuteNonQuery()) If ( a > 0) 然后 MessageBox.Show("已插入行") Else MessageBox.Show("已预订")
猜你喜欢
  • 1970-01-01
  • 2016-08-24
  • 2012-10-17
  • 1970-01-01
  • 2015-04-14
  • 1970-01-01
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
相关资源
最近更新 更多