【问题标题】:The INSERT statement conflicted with the CHECK constraintINSERT 语句与 CHECK 约束冲突
【发布时间】:2012-05-28 12:25:26
【问题描述】:

任何机构都可以给出建议。为什么我会收到这个错误。

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

【问题讨论】:

  • 唯一约束? FK 约束?可以发一下吗?
  • 让我知道如何找到引发错误的约束。在错误描述中我没有找到任何约束。
  • 使用 SQL Mgmt Studio,选择表 GL10000 并展开。但名字是CK_GL10000_TRXDATE__56701F76
  • 我看到了。我怎样才能通过使用该约束来解决这个问题。
  • 看起来TRXDATE 上的约束正在验证datetime 没有时间组件,并且您传递的数据违反了这一点。您可能要考虑在此列中使用 DATE 数据类型而不是 datetime

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


【解决方案1】:

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

【讨论】:

  • 在 GL10000 表中,我有这个约束:CK__GL10000__TRXDATE__56701F76。你能解释一下我该如何解决我的问题
  • @KiranReddy - 您需要查看该约束的定义 - 它几乎可以包含任何有效的 SQL 表达式 - 我们不知道里面有什么。
【解决方案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 数据类型。你可以阅读它here

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

【讨论】:

  • 我使用这个值使用了相同的存储过程。 (GLHdr.TRXDATE 值:“12-05-2007 12:15:15”)。今天我正在尝试使用相同的值执行。今天只出现错误。我想知道为什么会这样。
  • 代码中可能发生了一些变化,不能肯定地说,但我知道提供的数据会与提供的约束冲突。
【解决方案3】:

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

约束定义:

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

我的代码:

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

基于这个 CHECK 部分,你可以修改你的代码来完全填充检查条件,或者如果检查条件不正确,就修改它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多