0

TableAdapter を使用して、ループ内のテーブルにレコードを挿入しています。

foreach(....)
{
  ....
  ....
  teamsTableAdapter.Insert(_teamid, _teamname);
  ....
}

TeamID はテーブルの主キーで、_teamID はそれを挿入します。実際には、一意の teamId を含む XML ファイルからデータを抽出しています

このループの最初の実行後、Insert は Duplicate Primary Key found Exception をスローします。これを処理するために、私はこれをしました

foreach(....)
{
  ....
  ....

  try
  {
     _teamsTableAdapter.Insert(_teamid, _teamname);
  }
  catch (System.Data.SqlClient.SqlException e)
  {
     if (e.Number != 2627)
        MessageBox.Show(e.Message);
  }
  ....
  ....
}

しかし、try catch ステートメントを使用するとコストがかかります。この例外を回避するにはどうすればよいでしょうか。私はVS2010で作業していますが、動作しINSERT ... ON DUPLICATE KEY UPDATEません。

try catch ステートメントを避け、try catch ステートメントを使用せずに処理したい。

4

3 に答える 3

1

他の回答へのコメントに基づいて、TeamIDを主キーから変更し(可能な場合)、新しいIdx列を主キーとして設定することをお勧めします。次に、DBにトリガーを設定して、重複するTeamIDを使用して新しいレコードを挿入すると、元のレコードが更新され、新しいレコードが削除されます。

それが不可能な場合は、レコードを挿入するストアドプロシージャを変更して、挿入するだけでなく、最初に重複するTeamIDをチェックするようにします。重複するIDがない場合は、レコードを挿入できます。それ以外の場合は、「0を選択」します。

擬似コードの例:

Declare @Count int
Set @Count = (Select Count(TeamId) From [Table] where TeamId = @TeamId)

If(@Count > 0)
  Begin
    Select 0
  End
Else
 --Insert Logic Here

次に、コード内のInsertメソッドは、ExecuteNonQuery()ではなく、ExecuteScalar()にすることができます。あなたのコードはそれをこのように処理します

If(_teams.TableAdapter.Insert(_teamId, _teamName) == 0)
  {
    _teams.TableAdapter.Update(_teamId, _teamName)
  }

または、すべてをSQLで処理したい場合(つまり、C#コードを変更する必要がない場合)、次のようにすることができます。

Declare @Count int
Set @Count = Select Count(TeamId) from [Table] Where TeamId = @TeamId

If(@Count > 0)
  Begin
    //Update Logic
  End
Else
  Begin
    //Insert Logic
  End

しかし、繰り返しになりますが、それがオプションである場合は、テーブルを変更するだけです。

于 2010-06-17T13:58:09.883 に答える
1

データに明らかに重複があります。最初にそれらを削除するか、ある種のマージステートメントを使用して、新規の場合はisertを実行し、新規でない場合は更新を実行する必要があります。

問題の原因となっているデータを確認するには、アプリケーションからループを実行しているときにプロファイラーを実行し、ステートメントが実際に送信されていることを確認します。そのshoudlは、どのレコードが複製されるかを示します。

これが大きなファイルの場合、(重複をクリーニングした後の)一括挿入は行ごとの処理よりも高速になります。

于 2010-06-17T13:59:29.663 に答える
1

使用しているテーブルに主キーはありますか? そうでない場合は、レコードの重複を防ぎ、プログラムの他の部分のキーにアクセスしやすくなるため、作成する必要があります。

通常、これは ID 列などで行われます。(TeamID に関しては既に持っているように見えますが、その場合は、SQL-MS または VS2010 の主キーに変更するだけで済みます)。

編集: Visual Studio を使用して主キーを ID 列 (この例では teamID) として指定するには:

サーバー エクスプローラーに移動します。関連するテーブルに移動します。「テーブル定義を開く」を右クリックします。主キー列をクリックします。「ID 仕様」に到達するまでプロパティ ウィンドウをスクロールします。これを "yes" に変更します (インクリメント / シードは任意に設定できます。通常は 1,1 で問題ありません)。これで、チーム名をテーブルに挿入するだけで、TeamID が自動的に生成されます。

于 2010-06-17T13:29:08.003 に答える