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
4

3 回答 3

2

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

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

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

create proc taGLTransactionHeaderInsert
{
    @I_vTRXDATE DATE
}

并 CAST 为 DATE

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

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

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

GLHdr.TRXDATE.Date;

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

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

于 2012-05-28T13:46:20.867 回答
2

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

于 2012-05-28T12:28:14.590 回答
0

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

约束定义:

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

我的代码:

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

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

于 2014-08-28T06:01:18.160 回答