Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server INSERT语句与CHECK约束冲突_Sql Server_Sql Server 2008_C# 4.0 - Fatal编程技术网

Sql server INSERT语句与CHECK约束冲突

Sql server INSERT语句与CHECK约束冲突,sql-server,sql-server-2008,c#-4.0,Sql Server,Sql Server 2008,C# 4.0,任何人都能给出建议。为什么我会犯这个错误 System.Data.SqlClient.SqlException:INSERT语句与检查约束“CK_GL10000_TRXDATE_uu56701F76”冲突。冲突发生在数据库“TWO”、表“dbo.GL10000”、列“TRXDATE”中 这是我的存储过程: SqlCommand myCommand1 = new SqlCommand("taGLTransactionHeaderInsert", strcon); myCommand1.Com

任何人都能给出建议。为什么我会犯这个错误

System.Data.SqlClient.SqlException:INSERT语句与检查约束“CK_GL10000_TRXDATE_uu56701F76”冲突。冲突发生在数据库“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
    CHECK  (([ColumnName]='C' OR [ColumnName]='O'))

该表上有一个CHECK约束,您传递给存储过程的值要么与CHECK约束不匹配,要么与GL10000表中TRXDATE列的值不匹配。最简单的方法是使用SSMS浏览该表并找到检查约束。

该表上有一个检查约束,您传递给存储过程的值要么与检查约束不匹配,要么与GL10000表中的TRXDATE列不匹配。最简单的方法是使用SSMS浏览此表并找到检查约束。

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

set @I_vTRXDATE = convert(varchar, @I_vTRXDATE, 101)
在SQL 2008中,还可以使用日期数据类型

create proc taGLTransactionHeaderInsert
{
    @I_vTRXDATE DATE
}
并选为日期

DECLARE @I_vTRXDATE2 DATE
SET @I_vTRXDATE2 = CAST(@I_vTRXDATE as DATE)
这将删除传入的任何datetime值的时间部分。但是,如果传入日期+时间不正确,则可能会出现错误,您应该更正传入存储过程的值,该存储过程运行满足要求所需的任何业务逻辑规则

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

GLHdr.TRXDATE.Date;
还要注意,在SQL 2008中,引入了日期数据类型。你可以读到它


就我个人而言,我会消除这种限制。TRXDATE听起来像是“交易日期”的意思。一般来说,人们希望知道交易发生的确切日期和时间。出于演示目的,如果您只希望显示日期,则只需截断时间,但数据将完全完整。

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

set @I_vTRXDATE = convert(varchar, @I_vTRXDATE, 101)
在SQL 2008中,还可以使用日期数据类型

create proc taGLTransactionHeaderInsert
{
    @I_vTRXDATE DATE
}
并选为日期

DECLARE @I_vTRXDATE2 DATE
SET @I_vTRXDATE2 = CAST(@I_vTRXDATE as DATE)
这将删除传入的任何datetime值的时间部分。但是,如果传入日期+时间不正确,则可能会出现错误,您应该更正传入存储过程的值,该存储过程运行满足要求所需的任何业务逻辑规则

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

GLHdr.TRXDATE.Date;
还要注意,在SQL 2008中,引入了日期数据类型。你可以读到它


就我个人而言,我会消除这种限制。TRXDATE听起来像是“交易日期”的意思。一般来说,人们希望知道交易发生的确切日期和时间。出于演示目的,如果您只想显示日期,则只需截短时间,但您的数据将完全完整。

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

约束定义:

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
    CHECK  (([ColumnName]='C' OR [ColumnName]='O'))
我的代码:

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

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

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

约束定义:

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
    CHECK  (([ColumnName]='C' OR [ColumnName]='O'))
我的代码:

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

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

唯一约束?FK约束?您可以发布它吗?让我知道如何找到引发错误的约束。在错误描述中,我没有找到任何约束。使用SQL Mgmt Studio,选择表GL10000并展开。但是名称是CK_GL10000_TRXDATE_uu56701F76。我看到了。我如何通过使用该约束来解决此问题。看起来
TRXDATE
上的约束正在验证
datetime
没有时间组件,而您正在传递违反此约束的数据。您可能想考虑使用<代码>日期>代码>数据类型,而不是使用代码> > DATESTIME/COD>这个专栏。唯一的约束?FK约束?您可以发布它吗?让我知道如何找到引发错误的约束。在错误描述中,我没有找到任何约束。使用SQL Mgmt Studio,选择表GL10000并展开。但是名称是CK_GL10000_TRXDATE_uu56701F76。我看到了。我如何通过使用该约束来解决此问题。看起来
TRXDATE
上的约束正在验证
datetime
没有时间组件,而您正在传递违反此约束的数据。您可能想考虑使用<代码>日期<代码> DAT。