1

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

如果用户输入了 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 ----- 好的

已编辑

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

   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();
            }
        }
    }
4

3 回答 3

3

在列上创建唯一约束

单击此处查看示例

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

编辑:

根据您的评论,请尝试以下操作:

ALTER TABLE TIME.request
ADD CONSTRAINT uc_request UNIQUE (empid, startdate, enddate)
于 2012-10-09T13:42:28.843 回答
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);
}

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

于 2012-10-09T13:46:32.137 回答
0

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

插入 myTable(...)

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

这将适用于 Sql Server,但不适用于 MySql。

于 2012-10-09T13:44:01.013 回答