ダブルテーブル比較、新規、更新、削除データのテーブルを取得し、テーブルを更新するためのSQL文メソッドを取得
くだらないことは多くない,まず番号をつけなさい.
これはコードでテーブルデータを比較するもので、実は効率は高くありません.しかし、異なるデータテーブルのデータを比較すると、現在はそうするしかないようです(浅い).同じデータベースであれば、もちろんより高度な方法があり、SQL文で直接比較します(もちろん、データベースはサポートします)
SQLSERVERを書こう
実はコードが遅い主な原因は、更新データがあるかどうかを比較する部分、つまり上のContrastData()メソッドのコードで、増加や削除のデータを取得するのが速いことです.
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()メソッドのコードで、増加や削除のデータを取得するのが速いことです.