0

テーブル値パラメーターをC#コードからMS SQL Server2008R2ストアドプロシージャに送信しています。受け取ったエラーは次のとおりです。「PRIMARYKEY制約'PK_Example.ExampleTable'の違反。オブジェクト'Example.ExampleTable'に重複するキーを挿入できません。ステートメントは終了しました。」

テーブル構造:Example.ExampleTable

[ID] (PK, int, not null)
[Month] (PK, int, not null)
[Year] (PK, int, not null)
[ExternalTextReference] (varchar(150), null)
[UserNote] (varchar(MAX), null)
[CheckedComplete] (bit, not null)
  • PKが唯一の制約です。

ストアドプロシージャ:

ALTER PROCEDURE [dbo].[ExampleSaveGridCheckBatch]
@IDs IDLIST readonly,
@year int = 0,
@month int = 0,
@checked bit = 0
AS
BEGIN
     SET NOCOUNT ON;
     MERGE INTO [Example].[ExampleTable] AS Target 
     USING ( select * from @IDs )
            AS Source (ID)
     ON Target.ID = Source.ID
     WHEN MATCHED THEN
          UPDATE SET CheckedComplete = @checked
     WHEN NOT MATCHED BY TARGET THEN
          INSERT ([ID], [Year], [Month], [CheckedComplete]) 
          VALUES (Source.ID, @year, @month, @checked);
END

上記のIDLIST部分について:CREATE TYPE IDLIST AS TABLE (n int);

C#コード:

DataTable table = new DataTable("IDsList");            
DataColumn col1 = new DataColumn("ID", System.Type.GetType("System.Int32"));
table.Columns.Add(col1);

var cn = new SqlConnection();
createConnection(cn);

SqlCommand cmd = new SqlCommand("ExampleSaveGridCheckBatch", cn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@year", year);
cmd.Parameters.AddWithValue("@month", month);
cmd.Parameters.AddWithValue("@checked", checkstatus);
SqlParameter sparam = new SqlParameter("@IDs", SqlDbType.Structured);
foreach (int item in iDsList)
{
    table.Rows.Add(item);
}
sparam.Value = table;
cmd.Parameters.Add(sparam);

cmd.ExecuteNonQuery();

実行時にエラーが発生します。セットの例では、変数は次のとおりです。年:2011月:11チェックステータス:1 iDsList :( 71個の一意の整数のリスト)

私の機能の目的は、誰かがグリッド上の「すべてチェック」をクリックし、チェックされたステータスをデータベース内の影響を受ける各行に、各行を経由せずに保存することです。これは正規化によって作成された補助テーブルであるため、それぞれにレコードがある場合とない場合があります。したがって、マージされます。エラーが発生し、テーブルを切り捨てて再試行することで問題を単純化することにしましたが、テーブルが完全に空の場合でも、「キーの重複」エラーが発生します。

したがって、中心的な問題は、レコードのない重複キーエラーを発生させる方法と、エラーが発生しないように修正するにはどうすればよいかということです。

4

1 に答える 1

1

ExampleテーブルMonthと列ではYear、主キーとしてもマークされておりID、一意の値は含まれていないと思います。テーブルのMonthおよび列から主キー制約を削除して、再試行してください。YEAR

于 2011-12-17T06:19:05.833 に答える