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

テーブルにCHECK制約があり、ストアドプロシージャに渡す値がチェック制約と一致しないか、GL10000テーブルのTRXDATE列まで到達しようとしている値ではありません。最も簡単な方法は、SSMSを使用してこのテーブルを調べ、CHECK制約を見つけることです。

于 2012-05-28T12:28:14.590 に答える
2

ストアド プロシージャ 'taGLTransactionHeaderInsert' で、挿入の前に次の行を上部近くに追加します。

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

SQL 2008 では、DATE データ型も使用できます。

create proc taGLTransactionHeaderInsert
{
    @I_vTRXDATE DATE
}

そしてDATEとしてキャスト

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

これにより、渡される日時の値の時間部分が削除されます。ただし、日付と時刻を渡すのが正しくない場合、エラーが発生する可能性が高く、ビジネス ロジックを実行するストアド プロシージャに渡される値を修正する必要があります。要件を満たすために必要なルール。

渡される値を切り捨てることもできます。

GLHdr.TRXDATE.Date;

また、SQL 2008 では DATE データ型が導入されたことにも注意してください。ここでそれについて読むことができます。

個人的には、制約を削除します。TRXDATE は「取引日」の略のように聞こえます。一般に、トランザクションが発生した正確な日時を知りたいと思うでしょう。プレゼンテーションの目的で、日付のみを表示したい場合は、単に時間を切り捨てますが、データは完全に損なわれません。

于 2012-05-28T13:46:20.867 に答える
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 に答える