C# 如何跳过唯一约束冲突

C# 如何跳过唯一约束冲突,c#,asp.net,transactions,informix,unique-constraint,C#,Asp.net,Transactions,Informix,Unique Constraint,如果我将批量插入作为事务的一部分,如下所示: cmdTxt.Clear(); cmdTxt.Append(" INSERT INTO sc1pen "); cmdTxt.Append(" SELECT action_month,action_year,200,emp_num,penalty_action , "); cmdTxt.Append(" 'APPLY ' || penalty_reason || ' day ' , 0 , 0 "); cmdTxt.Append(" FROM sc

如果我将批量插入作为事务的一部分,如下所示:

cmdTxt.Clear();
cmdTxt.Append(" INSERT INTO  sc1pen ");
cmdTxt.Append(" SELECT action_month,action_year,200,emp_num,penalty_action , ");
cmdTxt.Append("  'APPLY ' || penalty_reason || ' day ' , 0 , 0 ");
cmdTxt.Append(" FROM sc2pen WHERE sal_year = ? and sal_month = ? and penalty_type = 1 and pay_type = 0 ");
myIfxCmd.CommandText = cmdTxt.ToString();

myIfxCmd.Parameters.Clear();

myIfxCmd.Parameters.Add("sal_year", IfxType.Integer);
myIfxCmd.Parameters.Add("sal_month", IfxType.Integer);

myIfxCmd.Parameters[0].Value = penaltyDt.Rows[0]["sal_year"];
myIfxCmd.Parameters[1].Value = penaltyDt.Rows[0]["sal_month"];

myIfxCmd.ExecuteNonQuery(); 


如果在插入过程中违反了
唯一约束
如何避免回滚整个事务,我希望跳过导致此唯一约束异常的行并继续插入过程。

很难猜测问题中两个表的模式是什么,但是我们可以做一些猜测,并根据这些猜测测试代码

半似然图式 INSERT语句的翻译 这是问题的INSERT语句的翻译

INSERT INTO sc1pen 
    SELECT action_month, action_year, 200 AS unidentified_1, emp_num, penalty_action,
           'APPLY ' || penalty_reason || ' day ' AS penalty_string,
           0 AS unidentified_2, 0 AS unidentified_3
      FROM sc2pen
     WHERE sal_year = 2016 AND sal_month = 4 AND penalty_type = 1 AND pay_type = 0;
由于我使用的是命令行工具,而不是嵌入式SQL或类似工具,因此我必须将问号替换为值-2016表示
sal_年
,4表示
sal_月

可能的合并语句 这主要是“阅读手册”上的声明


关于的
子句似乎是似是而非的;由于表中没有主键的标识,所以我们必须猜测连接条件应该是什么。

您可以修改INSERT语句,以确保不插入违反该约束的项。请参阅此帖子:您可以考虑该语句。“不匹配时插入”选项可能是与您相关的选项。@JonathanLeffler您能用您的语法在问题中写下我的查询吗。
INSERT INTO sc1pen 
    SELECT action_month, action_year, 200 AS unidentified_1, emp_num, penalty_action,
           'APPLY ' || penalty_reason || ' day ' AS penalty_string,
           0 AS unidentified_2, 0 AS unidentified_3
      FROM sc2pen
     WHERE sal_year = 2016 AND sal_month = 4 AND penalty_type = 1 AND pay_type = 0;
MERGE INTO sc1pen AS dst
    USING (
        SELECT action_month, action_year, 200 AS unidentified_1, emp_num, penalty_action,
               'APPLY ' || penalty_reason || ' day ' AS penalty_string,
               0 AS unidentified_2, 0 AS unidentified_3
          FROM sc2pen
         WHERE sal_year = 2016 AND sal_month = 4 AND penalty_type = 1 AND pay_type = 0
    ) AS src
    ON dst.action_month = src.action_month AND
       dst.action_year = src.action_year AND
       dst.emp_num = src.emp_num
    WHEN NOT MATCHED THEN INSERT VALUES(src.action_month, src.action_year,
                src.unidentified_1, src.emp_num, src.penalty_action,
                src.penalty_string, src.unidentified_2, src.unidentified_3)
    ;