0

MySQL サーバー側と ADO.NET スキーマ側 (XML スキーマ ファイルからロード) の両方で AutoIncrement が有効になっている ID 列を持ついくつかの DataTables があります。行を挿入するときにこれらの ID を気にする必要がないようにしたいと思います。それらの唯一の用途はテーブルの主キーを持つことだからです。外部キーの参照はありません。ただし、新しい行が追加される場合、DataTable には既に行が含まれています。つまり、ID が 1 から始まる行が DataTable に既に存在します。

ID 列の既定の AutoIncrementSeed 値は -1 で、AutoIncrementStep 値は 1 です (Visual Studio によって提供される既定値のままです)。dataTable.NewRow() で作成すると、ID -1 と 0 が取得されるため、一度に 2 つの新しい行を挿入するだけであれば、すべて問題ないようです。しかし、3 番目の行を追加する場合は、ID を取得します。 NewRow() によって 1 が割り当てられます。その後、ID = 1 の行が既に存在するため、dataTable.Rows.Add(...) を使用して新しい行を挿入しようとすると ConstraintException がスローされます。

ADO.NETスキーマのAutoIncrementのものを無効にすることは解決策ではないと思います.Rows.Add()で行を追加する前に、IDが一意であることを確認する必要があるためです。

この問題の簡単でエレガントな解決策は何ですか? 今のところ、これが非常に珍しい作業だとは想像できません。

ありがとうございました!

4

2 に答える 2

1

この問題を解決する非常に簡単な方法は、AutoIncrementStep プロパティも -1 に設定することです。これにより、ID が減少します (-1、-2、-3 など)。

これが役に立てば幸いです、スティーブ

于 2010-11-09T22:37:13.807 に答える
0

以下に示した例に似たものを試してみてください。別の行を追加する前に、テーブルでSelectを使用して、一意の列の値がすでに存在するかどうかを確認できます。

using (SqlConnection connection = new SqlConnection(sqlConnectionStr))
        {
            connection.Open();
            // Do work here.
            DataTable userTable = new DataTable("usertable");

            using (SqlCommand sqlCmd = new SqlCommand("select * from [user]"))
            {
                sqlCmd.Connection = connection;
                SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlCmd);
                dataAdapter.Fill(userTable);
            }

            int newUserId = 3;
            DataRow[] selectedRows = userTable.Select(  string.Format( "id={0}", newUserId));
            bool userIdAlreadyTaken = selectedRows.Length > 0 ;
            if( !userIdAlreadyTaken )
            {
                // Add new user
                DataRow newRow = userTable.Rows.Add(new object[] { 3, "John" });
            }
        }
于 2010-07-06T17:25:31.447 に答える