INSERT语句与CHECK约束冲突

时间:2012-05-28 12:25:27

标签: sql-server sql-server-2008 c#-4.0

任何机构都可以提出建议。为什么我收到此错误。

System.Data.SqlClient.SqlException:INSERT语句与CHECK约束“CK_ GL10000 _TRXDATE__56701F76”冲突。冲突发生在数据库“TWO”,表“dbo.GL10000”,列'TRXDATE'。

这是我的存储过程:

SqlCommand myCommand1 = new SqlCommand("taGLTransactionHeaderInsert", strcon);

  myCommand1.CommandType = CommandType.StoredProcedure;

  myCommand1.CommandText = "taGLTransactionHeaderInsert";

  myCommand1.Parameters.Add("@I_vBACHNUMB", SqlDbType.Char).Value = GLHdr.BACHNUMB;

  myCommand1.Parameters.Add("@I_vREFRENCE", SqlDbType.Char).Value = "ExcelImport";

  myCommand1.Parameters.Add("@I_vTRXDATE", SqlDbType.DateTime).Value = GLHdr.TRXDATE;

表格定义:

CREATE TABLE [dbo].[GL10000](

[PSTGSTUS] [smallint] NOT NULL,

[LASTUSER] [char](15) NOT NULL,

[LSTDTEDT] [datetime] NOT NULL,

[USWHPSTD] [char](15) NOT NULL,

[TRXTYPE] [smallint] NOT NULL

    /* More columns? not included in script that OP added */
)
GO

ALTER TABLE [dbo].[GL10000]  WITH CHECK ADD CHECK
  ((datepart(hour,[RVRSNGDT])=(0) AND datepart(minute,[RVRSNGDT])=(0)
  AND datepart(second,[RVRSNGDT])=(0) AND datepart(millisecond,[RVRSNGDT])=(0)))
GO

ALTER TABLE [dbo].[GL10000]  WITH CHECK ADD CHECK
  ((datepart(hour,[Tax_Date])=(0) AND datepart(minute,[Tax_Date])=(0)
  AND datepart(second,[Tax_Date])=(0) AND datepart(millisecond,[Tax_Date])=(0)))
GO

ALTER TABLE [dbo].[GL10000]  WITH CHECK ADD CHECK
  ((datepart(day,[TIME1])=(1) AND datepart(month,[TIME1])=(1)
  AND datepart(year,[TIME1])=(1900)))
GO

ALTER TABLE [dbo].[GL10000]  WITH CHECK ADD CHECK
  ((datepart(hour,[TRXDATE])=(0) AND datepart(minute,[TRXDATE])=(0)
  AND datepart(second,[TRXDATE])=(0) AND datepart(millisecond,[TRXDATE])=(0)))
GO

ALTER TABLE [dbo].[GL10000] ADD  CONSTRAINT
  [DF__GL10000__DEX_ROW__540C7B00]  DEFAULT (getutcdate()) FOR [DEX_ROW_TS]
GO

3 个答案:

答案 0 :(得分:2)

在存储过程'taGLTransactionHeaderInsert'中,在插入之前在顶部附近添加以下行。

set @I_vTRXDATE = convert(varchar, @I_vTRXDATE, 101)

在SQL 2008中,您还可以使用DATE数据类型。

create proc taGLTransactionHeaderInsert
{
    @I_vTRXDATE DATE
}

CAST as DATE

DECLARE @I_vTRXDATE2 DATE
SET @I_vTRXDATE2 = CAST(@I_vTRXDATE as DATE)

这将删除传入的任何日期时间值的时间部分。但是,如果传入日期+时间不正确,则可能会出现错误,您应该更正传递给运行的存储过程的值满足要求所必需的任何业务逻辑规则。

您也可以截断传入的值,即

GLHdr.TRXDATE.Date;

另请注意,在SQL 2008中,引入了DATE数据类型。你可以阅读它here

就个人而言,我会删除约束。 TRXDATE听起来像是“交易日期”。通常,人们想知道交易发生的确切日期和时间。出于演示目的,如果您只想显示DATE,那么只需截断时间,但您的数据将完整无缺。

答案 1 :(得分:1)

表上有一个CHECK约束,并且传递给存储过程的值与检查约束不匹配,或者不是尝试使其达到TRXDATE列的值。 GL10000表。最简单的方法是使用SSMS来探索此表并找到CHECK约束。

答案 2 :(得分:0)

这个问题出现已经有一段时间了, 我遇到了类似的错误,所以这样做是为了找出 CHECK 中的规则是什么: 从SQL服务器管理(我当前的版本2012),单击导致错误的表,然后展开约束文件夹,
右键单击有问题的约束并选择“修改”,这将显示约束的定义, 您可以在定义中轻松找到 CHECK 部分,我的情况是检查我的列是否仅获取 我的列的'C'或'O'字符,而在代码中,我试图插入一个'E'字符。

约束定义:

    CHECK  (([ColumnName]='C' OR [ColumnName]='O'))

我的代码:

         switch (item.Type)
           {
            case myType.Elective:
                entityName.ColumnName = "E";
                .
                .
                .
            }

根据此CHECK部分,您可以修改代码以完全填写检查条件,或者如果检查条件不正确,只需修改它。