在插入新记录之前检查表以查找现有记录

时间:2012-10-09 13:38:58

标签: c# sql asp.net detailsview

我有一个详细信息视图,我用来填充值的表。它现在正确插入值,但我现在需要检查用户是否正在尝试输入会干扰以前记录的新记录。

如果用户输入的新事件属于2012-12-12,但同一用户已经输入了2012-12-12的记录,那么我希望抛出错误并且无法插入记录。

只是检查一个独特的时间记录不会工作,因为不同的用户可以创建一个偶然的2012-12-12,这是可以接受的。只有同一个用户无法创建相同的事件日期。所以我知道我需要检查表中的两个字段,但我不确定如何在我的代码中进行此检查。

例如:

用户1新活动2012-12-12 -----确定

用户2新活动2012-12-12 -----确定

用户3新活动2012-12-12 -----确定

用户2新事件2012-12-12 -----应该抛出错误并且不允许创建该记录。

用户3新活动2012-10-12 -----确定

EDITED

目前我正在使用它来更新表格:

   public void UpdateForm(Int64 requestid,
                              Decimal empid,
                              String leave,
                              DateTime startdate,
                              DateTime enddate,
                              String starttime,
                              String endtime,
                              String standby,
                              String status,
                              String rsn,
                              String remarks,
                              String approver,
                              String with,
                              String reqleave,
                              String FIRSTNAME,
                              String LASTNAME)
    {

        var CurrUser = "a03       ";

        Account.Login uusr = new Account.Login();
        CurrUser = uusr.User.Identity.Name.ToString().ToUpper();

        var sql = "update TIME.request set empid=@empid, leave=@leave, with=@with, startdate=@startdate, reqleave=@reqleave, enddate=@enddate, starttime=@starttime, endtime=@endtime, standby=@standby, status=@status, rsn=@rsn, remarks=@remarks, approver=@approver where requestid = @requestid";

        using (iDB2Connection conn = new iDB2Connection(GetConnectionString()))
        {
            conn.Open();

            using (iDB2Command cmd = new iDB2Command(sql, conn))
            {
                cmd.DeriveParameters();
                cmd.Parameters["@requestid"].Value = requestid;
                cmd.Parameters["@empid"].Value = empid;
                cmd.Parameters["@leave"].Value = leave;
                cmd.Parameters["@startdate"].Value = startdate;
                cmd.Parameters["@enddate"].Value = enddate;
                cmd.Parameters["@starttime"].Value = starttime;
                cmd.Parameters["@endtime"].Value = endtime;
                cmd.Parameters["@standby"].Value = standby;
                cmd.Parameters["@status"].Value = status;
                cmd.Parameters["@rsn"].Value = rsn;
                cmd.Parameters["@remarks"].Value = remarks;
                cmd.Parameters["@approver"].Value = approver;
                cmd.Parameters["@reqleave"].Value = reqleave;
                cmd.Parameters["@with"].Value = with;

                cmd.ExecuteNonQuery();
            }
        }
    }

3 个答案:

答案 0 :(得分:3)

在列

上创建唯一的约束

Click here for examples

ALTER TABLE <table_name>
ADD CONSTRAINT <constraint name> UNIQUE (user,date)

修改

根据您的评论,请尝试:

ALTER TABLE TIME.request
ADD CONSTRAINT uc_request UNIQUE (empid, startdate, enddate)

答案 1 :(得分:1)

创建存储过程并输出参数,检查插入项是否存在:

if exists(select 1 from table where user = @user and eventtime = @eventtime)
  begin
    set @output = 'event already exists'
  end 
else
 begin
    --Prevent DBNull output, see comments
    set @output = ''
   --Insert into table
 end

通过C#

向程序添加输出参数
  var output = new SqlParameter() { Direction = ParameterDirection.Output, ParameterName = "@Output" };
  var cmd = new SqlCommand("procname", connection)
  cmd.Parameters.Add(output);
  //Add other params
  cmd.ExecuteNonQuery();
  if (!string.IsNullOrEmpty(output.Value))
    //Handle the error
    throw new Exception("Already exists");

使用上面的相关参数,您正在寻找SQL中的存储过程,如果您有不明白的事情,请发表评论。

编辑:如何创建和调用过程

CREATE PROCEDURE [dbo].[Prefix_SomeProcName]

--Parameters you need from the front end
@User varchar(50),
@EventTime datetime,
@Output varchar(100) output

--Created by: Your name
--Created date: Todays date
--Description: To do some stuff

AS

--Do your stuff here
if exists(select 1 from table where user = @user and eventtime = @eventtime)
  begin
    set @output = 'event already exists'
  end 
else
 begin
    --Prevent DBNull output, see comments
    set @output = ''
   --Insert into table
 end

然后您需要导入System.Data.SqlClient并执行以下操作。

using(SqlConnection con = New SqlConnection("ConnectionString")
{
   SqlCommand cmd = new SqlCommand("Prefix_SomeProcName", con);
   cmd.CommandType = CommandType.StoredProcedure;
   var output = new SqlParameter() { Direction = ParameterDirection.Output, ParameterName = "@Output" };
   //Add your other parameters
   SqlDataAdapter sda = new SqlDataAdapter(cmd);
   DatatTable dt = New DataTable();
   sda.Fill(dt);
}

如果其中有select语句,DataTable现在将具有该过程的内容。此外,在Fill()命令之后,您可以访问上面代码中提到的output.Value。

答案 2 :(得分:0)

如果此行为是epxected并且您不希望捕获异常的开销,则可以在与isnert相同的操作中检查是否存在:

插入myTable(...)

select ...
where not exists (select 1 from myTable where....)

这将在Sql Server中运行,但不适用于MySql。