1

テーブルに値を入力するために使用している詳細ビューがあります。現在、値が正しく挿入されていますが、ユーザーが以前のレコードに干渉する可能性のある新しいレコードを入力しようとしているかどうかを確認する必要がありました。

ユーザーが2012-12-12に該当する新しいイベントを入力したが、同じユーザーがすでに2012-12-12のレコードを入力している場合、エラーがスローされ、レコードを挿入できません。

別のユーザーが2012-12-12を作成することもでき、それは許容できるため、時間の一意のレコードをチェックするだけでは機能しません。同じユーザーだけが同じイベントの日付を作成することはできません。したがって、テーブル内の2つのフィールドをチェックする必要があることはわかっていますが、コードでこのチェックを行う方法がわかりませんでした。

例えば:

ユーザー1の新しいイベント2012-12-12-----ok

ユーザー2の新しいイベント2012-12-12-----ok

ユーザー3の新しいイベント2012-12-12-----ok

ユーザー2の新しいイベント2012-12-12-----エラーをスローし、そのレコードの作成を許可しないようにする必要があります。

ユーザー3の新しいイベント2012-10-12-----ok

編集済み

現在、これを使用してテーブルを更新しています。

   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 のストアド プロシージャは、上記に続く関連するパラメータを使用して探しているものです。不明な点がある場合はコメントしてください。

EDIT:プロシージャを作成して呼び出す方法

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選択ステートメントが含まれている場合、プロシージャの内容が含まれます。また、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 に答える