ダブルテーブル比較、新規、更新、削除データのテーブルを取得し、テーブルを更新するためのSQL文メソッドを取得


くだらないことは多くない,まず番号をつけなさい.
 
using System;
using System.Text;
using System.Data;

namespace Method
{
    class Contrast
    {
        /// 
        ///      
        /// 
        ///   
        ///   
        ///     (     )
        ///         
        ///         
        ///         
        public void ContrastDataTable(DataTable oldDT, DataTable newDT, string keyName, out DataTable addDT, out DataTable updateDT, out DataTable deleteDT)
        {
            //   、 、        
            addDT = newDT.Clone();
            updateDT = newDT.Clone();
            deleteDT = newDT.Clone();

            //    
            int columnCount = newDT.Columns.Count;

            //    
            DataView oldDV = oldDT.DefaultView;
            DataView newDV = newDT.DefaultView;

            //          
            foreach (DataRowView drv in oldDV)
            {
                newDV.RowFilter = keyName + " = '" + drv[keyName] + "'";
                if (newDV.Count > 0)
                {
                    if (ContrastData(drv, newDV[0]))
                    {
                        updateDT.Rows.Add(newDV[0].Row.ItemArray);
                        continue;
                    }
                }
                else
                {
                    deleteDT.Rows.Add(drv.Row.ItemArray);
                }
            }

            //       
            newDV.RowFilter = string.Empty;//      
            foreach (DataRowView drv in newDV)
            {
                oldDV.RowFilter = keyName + " = '" + drv[keyName] + "'";
                if (oldDV.Count == 0)
                {
                    addDT.Rows.Add(drv.Row.ItemArray);
                }
            }

        }

        /// 
        ///     
        /// 
        ///     
        ///     
        /// 
        private bool ContrastData(DataRowView dv1, DataRowView dv2)
        {
            //        ,    true
            object value1;
            object value2;
            for (int i = 0; i < dv1.Row.ItemArray.Length; i++)
            {
                value1 = dv1[i].ToString();
                value2 = dv2[i].ToString();
                if (!value1.Equals(value2))
                {
                    return true;
                }
            }
            return false;
        }

        /// 
        ///   SQL  
        /// 
        ///         
        ///         
        ///         
        ///          
        ///     (     )
        ///      SQL  
        ///      SQL  
        ///      SQL  
        public void CreateSql(DataTable addDT, DataTable updateDT, DataTable deleteDT, string tableName, string keyName, out string addSql, out string updateSql, out string deleteSql)
        {
            //     SQL    
            {
                StringBuilder addSqlSB = new StringBuilder();
                for (int i = 0; i < addDT.Rows.Count; i++)
                {
                    StringBuilder addSqlSB2 = new StringBuilder("INSERT INTO [" + tableName + "](");
                    for (int j = 0; j < addDT.Columns.Count; j++)
                    {
                        addSqlSB2.Append("[" + addDT.Columns[j].ColumnName + "], ");
                    }
                    addSqlSB2.Remove(addSqlSB2.Length - 2, 2);//     “, ”
                    addSqlSB2.Append(") VALUES(");
                    for (int j = 0; j < addDT.Columns.Count; j++)
                    {
                        if (addDT.Rows[i][j] == DBNull.Value)
                        {
                            addSqlSB2.Append("NULL, ");
                        }
                        else
                        {
                            addSqlSB2.Append("'" + FormatValue(addDT.Rows[i][j]) + "', ");
                        }
                    }
                    addSqlSB2.Remove(addSqlSB2.Length - 2, 2);//     “, ”
                    addSqlSB2.Append(");");
                    addSqlSB.Append(addSqlSB2);
                }
                addSql = addSqlSB.ToString();
            }

            //     SQL    
            {
                StringBuilder updateSqlSB = new StringBuilder();
                for (int i = 0; i < updateDT.Rows.Count; i++)
                {
                    StringBuilder updateSqlSB2 = new StringBuilder("UPDATE [" + tableName + "] SET ");
                    for (int j = 0; j < updateDT.Columns.Count; j++)
                    {
                        if (!updateDT.Columns[j].ColumnName.Equals(keyName))
                        {
                            if (updateDT.Rows[i][j] == DBNull.Value)
                            {
                                updateSqlSB2.Append("[" + updateDT.Columns[j].ColumnName + "] = NULL, ");
                            }
                            else
                            {
                                updateSqlSB2.Append("[" + updateDT.Columns[j].ColumnName + "] = '" + FormatValue(updateDT.Rows[i][j]) + "', ");
                            }
                        }
                    }
                    updateSqlSB2.Remove(updateSqlSB2.Length - 2, 2);//     “, ”
                    updateSqlSB2.Append(" WHERE [" + keyName + "] = '" + updateDT.Rows[i][keyName] + "';");
                    updateSqlSB.Append(updateSqlSB2);
                }
                updateSql = updateSqlSB.ToString();
            }

            //     SQL    
            {
                if (deleteDT.Rows.Count == 0)
                {
                    deleteSql = string.Empty;
                }
                else
                {
                    StringBuilder deleteSqlSB = new StringBuilder("DELETE FROM [" + tableName + "] WHERE [" + keyName + "] IN(");
                    for (int i = 0; i < deleteDT.Rows.Count; i++)
                    {
                        deleteSqlSB.Append("'" + deleteDT.Rows[i][keyName] + "'");
                        if (i != deleteDT.Rows.Count - 1)
                        {
                            deleteSqlSB.Append(", ");
                        }
                    }
                    deleteSqlSB.Append(");");
                    deleteSql = deleteSqlSB.ToString();
                }
            }
        }

        /// 
        ///     
        /// 
        ///        
        ///        
        private object FormatValue(object o)
        {
            if (o != null)
            {
                string temp = Convert.ToString(o);
                if (temp.Contains("'"))
                {
                    temp = temp.Replace("'", "''");
                }
                return temp;
            }
            return null;
        }
    }
}
説明:
これはコードでテーブルデータを比較するもので、実は効率は高くありません.しかし、異なるデータテーブルのデータを比較すると、現在はそうするしかないようです(浅い).同じデータベースであれば、もちろんより高度な方法があり、SQL文で直接比較します(もちろん、データベースはサポートします)
SQLSERVERを書こう
--         
SELECT * FROM [OLD] WHERE [ID] IN((SELECT [ID] FROM [OLD]) EXCEPT (SELECT [ID] FROM [NEW]));

--         
SELECT * FROM [NEW] WHERE [ID] IN((SELECT [ID] FROM [NEW]) EXCEPT (SELECT [ID] FROM [OLD]));

--         
SELECT * FROM [NEW] WHERE [ID] IN (((SELECT [ID] FROM [OLD]) INTERSECT (SELECT [ID] FROM [NEW])) EXCEPT (SELECT [ID] FROM((SELECT * FROM [OLD]) INTERSECT (SELECT * FROM [NEW]))AS T));
データベース自体を利用する比較は非常に速く、本人が測定したことがある.
 
実はコードが遅い主な原因は、更新データがあるかどうかを比較する部分、つまり上のContrastData()メソッドのコードで、増加や削除のデータを取得するのが速いことです.