2012-05-28 155 views
0

任何人都可以給出建議。爲什麼我得到這個錯誤。INSERT語句與CHECK約束衝突

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 
+0

唯一約束? FK約束?你可以發佈嗎? –

+0

讓我知道如何找到哪個約束會引起錯誤。在錯誤描述中,我沒有發現任何約束。 –

+0

使用SQL Mgmt Studio,選擇表GL10000並展開。但是,我的名字是CK_GL10000_TRXDATE__56701F76 –

回答

1

有在桌子上CHECK約束,並要傳遞到存儲過程的值或者不匹配檢查約束,或者不是試圖使其達到GL10000表中的TRXDATE列的值。最簡單的方法是使用SSMS來探索這個表格並找到CHECK約束。

+0

在GL10000表中我有這個costraint:CK__GL10000__TRXDATE__56701F76。你能解釋我怎樣才能解決我的問題 –

+0

@KiranReddy - 你需要查看該約束的定義 - 它可能包含幾乎任何有效的SQL表達式 - 我們不知道里面有什麼。 –

1

在存儲過程'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,那麼只需截斷時間,但數據將完整無缺。

+0

我使用此值與此存儲過程一起工作。 (GLHdr.TRXDATE值:「12-05-2007 12:15:15」)。今天,我正在嘗試使用相同的值執行操作。今天只是出現錯誤。我想知道爲什麼會發生這種情況。 –

+0

可能在代碼中發生了某些變化,但無法確定,但我確實知道提供的數據將與提供的約束條件衝突。 –

0

它已經有一段時間,這一問題被興起, 我有一個類似的錯誤,所以這樣做是爲了找出什麼是CHECK完全規則: 從SQL Server Management(我2012當前版本)點擊所導致錯誤的表,然後展開約束文件夾,
右鍵單擊問題的約束,並選擇「修改」,這將顯示約束的定義, 你可以很容易地找到CHECK部分在定義中,對於我的情況,它檢查我的列是否對於我的專欄只有'C'或'O'字符的 字符,而在代碼中,我試圖插入字符'E'。

約束定義:

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

我的代碼:

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

在此基礎上檢查部分,您可以修改代碼以完全填充檢驗條件,或者檢查條件是不正確的,只需修改它即可。

相關問題