簡體   English   中英

INSERT語句與CHECK約束沖突

[英]The INSERT statement conflicted with the CHECK constraint

任何人都可以提出建議。為什么會出現此錯誤。

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

在存儲過程'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)

這將刪除傳遞的任何datetime值的時間部分。但是,如果傳遞的date + time不正確,則很可能會出現該錯誤,您應該更正傳遞給運行任何業務邏輯的存儲過程的值滿足要求的必要規則。

您也可以截斷傳入的值,即

GLHdr.TRXDATE.Date;

另請注意,在SQL 2008中,引入了DATE數據類型。 你可以在這里閱讀。

我個人將取消約束。 聽起來TRXDATE代表“交易日期”。 通常,人們會想知道交易發生的確切日期和時間。 出於演示目的,如果僅希望顯示DATE,則只需截斷時間,但數據將完全保留。

該表上有一個CHECK約束,並且您傳遞給存儲過程的值與該檢查約束不匹配,或者不是試圖使其達到GL10000表中TRXDATE列的值。 最簡單的選擇是使用SSMS瀏覽此表並找到CHECK約束。

自從出現此問題已有一段時間以來,我遇到了類似的錯誤,所以這樣做是為了找出CHECK中的確切規則:從SQL Server管理(我當前的版本2012)中,單擊導致錯誤,然后展開“ 約束”文件夾,
右鍵單擊有問題的約束,然后選擇“ 修改 ”,這將顯示約束的定義,您可以輕松地在定義中找到CHECK部分,對於我來說,這是檢查我的列是否僅獲得'C'字符或我的列為“ O”,而在代碼中,我試圖插入字符“ E”。

約束定義:

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

我的代碼:

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

基於此CHECK部分,您可以修改代碼以完全滿足檢查條件,或者如果檢查條件不正確,則只需對其進行修改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM