【问题标题】:Checking if a row already exists in SQL Server database using stored procedure使用存储过程检查 SQL Server 数据库中是否已存在行
【发布时间】:2015-06-25 22:23:52
【问题描述】:

我已经插入了两行具有相同内容的表,但搜索现有数据的代码没有返回所需的结果。

这是我的 VB.Net 代码:

Private Sub BtnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSave.Click

    Try

If DateTimePicker1.Value.Date >= DateTime.Parse(TxtDateFrom.Text) And DateTimePicker1.Value.Date <= DateTime.Parse(TxtDateTo.Text) Then


    Dim cmd1 As New SqlCommand
            cmd1 = New SqlCommand("check_sched", connection)
            cmd1.CommandType = CommandType.StoredProcedure
            Dim rd As SqlDataReader
            cmd1.Parameters.AddWithValue("@empid", Label17.Text)
            cmd1.Parameters.AddWithValue("@datesched", DateTimePicker1.Value.Date)
            cmd1.Parameters.AddWithValue("@timefrom", TimePicker1.Text)
            cmd1.Parameters.AddWithValue("@timeto", TimePicker1.Text)
            rd = cmd1.ExecuteReader()


            If rd.HasRows Then

                MsgBox("Employee already assigned a job for the particular time period", MsgBoxStyle.Information, "Change Time Period")

            Else

                Dim cmd As New SqlCommand
                cmd = New SqlCommand("insert_schedule1", connection)
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Parameters.Add("@actid", SqlDbType.Int).Value = Label2.Text
                cmd.Parameters.Add("@activity", SqlDbType.NVarChar).Value = CmbActivity.Text
                cmd.Parameters.Add("@serviceid", SqlDbType.Int).Value = Label14.Text
                cmd.Parameters.Add("@servicename", SqlDbType.NVarChar).Value = TxtServiceType.Text
                cmd.Parameters.Add("@pdatefrom", SqlDbType.NVarChar).Value = TxtDateFrom.Text
                cmd.Parameters.Add("@pdateto", SqlDbType.NVarChar).Value = TxtDateTo.Text
                cmd.Parameters.Add("@deptname", SqlDbType.NVarChar).Value = Label16.Text
                cmd.Parameters.Add("@emp", SqlDbType.NVarChar).Value = CmbEmp.Text
                cmd.Parameters.Add("@empid", SqlDbType.Int).Value = Label17.Text
                cmd.Parameters.Add("@datesched", SqlDbType.DateTime).Value = myDate1
                cmd.Parameters.Add("@timefrom", SqlDbType.Time).Value = TimePicker1.Value.TimeOfDay
                cmd.Parameters.Add("@timeto", SqlDbType.Time).Value = TimePicker2.Value.TimeOfDay
                cmd.Parameters.Add("@status", SqlDbType.Int).Value = "1"
                cmd.ExecuteNonQuery()
                MsgBox("Scheduled Successfully", MsgBoxStyle.Information, "Task Schedule")
                CmbActivity.Text = ""
                TxtServiceType.Text = ""
                TxtDateFrom.Text = ""
                TxtDateTo.Text = ""
                'CmbSactivity.Text = ""
                CmbEmp.Text = ""
                DateTimePicker1.Text = Now
                TimePicker1.Text = TimeOfDay
                TimePicker2.Text = TimeOfDay
            End If
        Else
            MsgBox("Please select a date within the duration", MsgBoxStyle.Information, "Invalid Date")
        End If

    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

谁能帮我找出错误?

这是我的存储过程

create procedure check_sched
    @empid int,
    @datesched datetime,
    @timefrom datetime,
    @timeto datetime
as 
begin
    SELECT * 
    FROM tbl_schedule 
    WHERE empid = @empid 
      AND datesched = @datesched 
      AND timefrom >= @timefrom 
      AND timeto <= @timeto
end

表架构:

CREATE TABLE [dbo].[tbl_schedule]
(   
     [actid] [int] NULL,    
     [activity] [nvarchar](350) NULL,   
     [serviceid] [int] NULL,    
     [servicename] [nvarchar](50) NULL,     
     [pdatefrom] [nvarchar](50) NULL,   
     [pdateto] [nvarchar](50) NULL,     
     [sactid] [int] NULL,   
     [sactivity] [nvarchar](500) NULL,  
     [deptname] [nvarchar](150) NULL,   
     [emp] [nvarchar](150) NULL,    
     [empid] [int] NULL,    
     [datesched] [datetime] NULL,   
     [timefrom] [datetime] NULL,    
     [timeto] [datetime] NULL,
     [actimefrom] [datetime] NULL,  
     [actimeto] [datetime] NULL,
     [completed] [int] NULL,    
     [status] [int] NULL 
) ON [PRIMARY]

【问题讨论】:

  • 请提供表格结构和想要的结果。
  • 用表定义编辑了问题。现在面临的问题是这段代码没有显示任何错误,但是如果我输入了两个具有相同 empid 、 datesched、timefrom 和 timeto 的字段,它应该显示消息框该员工已在该时间段分配了另一份工作。
  • 而是将数据再次添加到数据库中,显示消息框“计划成功”

标签: sql .net sql-server vb.net sql-server-2008


【解决方案1】:

您的检查计划对@timeFrom@timeTo 字段使用TimePicker1 值,而您的插入分别使用TimePicker1TimePicker2。这会导致您的支票查看错误的日期。

为避免将来出现此问题并更容易找到这些错误,请尝试重构名称以匹配它们的用途(例如 fromTimePickertoTimePicker)。

【讨论】:

  • 另外,我建议在 INSERT 存储过程中检查员工在那个时间段内是否已经被分配到另一个工作,并让它返回一个指示成功或失败的位输出参数。
猜你喜欢
  • 1970-01-01
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
  • 2010-10-15
  • 1970-01-01
  • 2012-06-03
相关资源
最近更新 更多