0

.Merge() メソッドを使用して DataTables をマージする際に値をオーバーライドする方法はありますか?

たとえば、同じ回路図を持つ 2 つの DataTable があるとします。

両方とも 2 つの列があります。Names | Enabled;

DataTable1 の最初の行のエントリは次のとおりです。Peter Punani | true;

DataTable2 の最初の行のエントリは次のとおりです。Peter Punani | false;

.Merge() メソッドを使用してそれらをマージするDataTable1.merge(DataTable2);と、DataTable1 は 2 行になり、次のようになります。

Names | Enabled;  
Peter Punani | true;  
Peter Punani | false;  

明らかに、SQL DB に対して SqlCommandBuilder を使用して .Update() を実行しようとすると、主キー (名前) に 2 つの同一の値があるため、エラー ステートメントが表示されます。

しかし、DB1 に DB2 との違いを受け入れてもらいたいので、次のようになります (DB1 とは異なる他のすべてのエントリでそれを行います)。

Names | Enabled;  
Peter Punani | false; 

では、これらのテーブルを適切に更新できるようにマージする最良の方法は何ですか?

4

1 に答える 1

0

私は今、この方法で自分のメソッドを実装しました:

public static bool synchSqlData(DataTable UpdateTable, string selectedTableName, SqlConnection sqlCon, DataTable MergeTable, bool merge)
    {
        bool success = false;
        //Mitgabe eines SELECT cmds für SqlCommandBuilder zum generieren von INSERT,DELETE und UPDATE
        using (SqlCommand sqlCom = new SqlCommand("SELECT * FROM dbo." + selectedTableName, sqlCon))
        {
            SqlDataAdapter da = new SqlDataAdapter(sqlCom);
            SqlCommandBuilder cmb = new SqlCommandBuilder(da);

            da.InsertCommand = cmb.GetInsertCommand();
            da.DeleteCommand = cmb.GetDeleteCommand();
            da.UpdateCommand = cmb.GetUpdateCommand();

            //Zuweisen von PKs
            UpdateTable.PrimaryKey = new DataColumn[] { UpdateTable.Columns[0] };
            MergeTable.PrimaryKey = new DataColumn[] { MergeTable.Columns[0] };

            //Zusammenführen der beiden DataTables in UpdateTable
            if (merge)
            {
                //Setzen der Rows auf changed damit sie bei da.Update() auch erkannt werden ;)
                foreach (DataRow dr in MergeTable.Rows)
                {
                    if (dr.RowState == DataRowState.Unchanged)
                    {
                        dr.SetAdded();
                    }
                    //Entfernen von doppelten Zeilen zur Änderung einzelner values
                    DataRow doubleRow = UpdateTable.Rows.Find(dr[0].ToString());
                    if (doubleRow != null)
                    {
                        doubleRow.Delete();
                    }
                }
                UpdateTable.Merge(MergeTable);
                MessageBox.Show("Merge abgeschlossen.");
            }

            try
            {
                da.Update(UpdateTable);
                success = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error has occured!" + ex.Message);
                success = false;
            }
        }
        return success;
    }

基本的に、マージして更新する前にすべての重複行を削除するだけで、うまく機能しますが、おそらく理想的な解決策ではありません。

于 2015-03-26T15:42:33.083 に答える