搜索
查看: 1132|: 0

【SQLServer】SQLServer数据全同步及价值分析

[复制链接]

322

主题

0

回帖

1208

积分

网站编辑

积分
1208
发表于 2014-10-28 11:14:44 | 显示全部楼层 |阅读模式

1. 本函数仅支持单向同步,即从一个主数据库想多个从数据库同步

2.主数据库的任何增删改都会同步到所有从数据库上

3. 最重要的一点:同步数据库的价值所在:当主数据库服务器不可用时,程序可以使用其他从数据库或者备用数据库,这对于未来公有云和私有云应用具有重大价值!

代码:

  1. <font color="rgb(51, 51, 51)"><font face="宋体"><span style="font-size:18px;">/// <summary>
  2.         /// Note: for columns, the first string must be primary key name!
  3.         /// </summary>
  4.         /// <param name="server"></param>
  5.         /// <param name="database"></param>
  6.         /// <param name="uid"></param>
  7.         /// <param name="password"></param>
  8.         /// <param name="tableName"></param>
  9.         /// <param name="columns"></param>
  10.         /// <param name="ignoreUpdateColumns"></param>
  11.         /// <param name="ignoreInsertColumns"></param>
  12.         public void BulkUpdateTo(string server, string database, string uid, string password, string tableName, List<string> columns, List<string> ignoreUpdateColumns, List<string> ignoreInsertColumns)
  13.         {
  14.             string primaryKeyName = columns[0];
  15.             string connectionString = "Server=" + server + ";Database=" + database + ";User Id=" + uid + ";Password=" + password;
  16.             // Create destination connection
  17.             SqlConnection destinationConnector = new SqlConnection(connectionString);

  18.             SqlCommand cmd = new SqlCommand("SELECT * FROM " + tableName, destinationConnector);
  19.             // Open source and destination connections.
  20.             this.EnsureConnectionIsOpen();
  21.             destinationConnector.Open();

  22.             Dictionary<int, string> Index_PrimaryKeyValue = new Dictionary<int, string>();

  23.             SqlDataReader readerSource = cmd.ExecuteReader();
  24.             Dictionary<string, Dictionary<string, string>> recordsDest = new Dictionary<string, Dictionary<string, string>>();
  25.             int i = 0;
  26.             while (readerSource.Read())
  27.             {
  28.                 Index_PrimaryKeyValue.Add(i, readerSource[primaryKeyName].ToString());
  29.                 string recordIndex = Index_PrimaryKeyValue[i];
  30.                 recordsDest[recordIndex] = new Dictionary<string, string>();
  31.                 foreach (string keyName in columns)
  32.                 {
  33.                     recordsDest[recordIndex].Add(keyName, readerSource[keyName].ToString());
  34.                 }
  35.                 i++;
  36.             }

  37.             // Select data from Products table
  38.             cmd = new SqlCommand("SELECT * FROM " + tableName, mySqlConn);
  39.             // Execute reader
  40.             SqlDataReader reader = cmd.ExecuteReader();
  41.             Dictionary<string, Dictionary<string, string>> recordsSource = new Dictionary<string, Dictionary<string, string>>();

  42.             Dictionary<int, string> Index_PrimaryKeyValue2 = new Dictionary<int, string>();

  43.             int j = 0;
  44.             while (reader.Read())
  45.             {
  46.                 Index_PrimaryKeyValue2.Add(j, reader[primaryKeyName].ToString());
  47.                 string recordIndex = Index_PrimaryKeyValue2[j];
  48.                 recordsSource[recordIndex] = new Dictionary<string, string>();
  49.                 foreach (string keyName in columns)
  50.                 {
  51.                     recordsSource[recordIndex].Add(keyName, reader[keyName].ToString());
  52.                 }
  53.                 j++;
  54.             }
  55.             reader.Close();
  56.             readerSource.Close();

  57.             foreach (var record in recordsSource)
  58.             {
  59.                 string setScripts = string.Empty;
  60.                 string insertKeysScripts = string.Empty;
  61.                 string insertValuesScripts = string.Empty;
  62.                 int setScriptsIndex = 0;
  63.                 int insertScriptsIndex = 0;
  64.                 string primaryKeyValue = record.Key;
  65.                 if (recordsDest.ContainsKey(primaryKeyValue))
  66.                 {
  67.                     foreach (string keyName in columns)
  68.                     {
  69.                         if (!ignoreUpdateColumns.Contains(keyName))
  70.                         {
  71.                             if (recordsDest[primaryKeyValue][keyName] == record.Value[keyName])
  72.                             {
  73.                                 //do nothing
  74.                             }
  75.                             else
  76.                             {
  77.                                 if (setScriptsIndex == 0)
  78.                                 {
  79.                                     setScripts += keyName + "='" + recordsSource[primaryKeyValue][keyName] + "' ";
  80.                                 }
  81.                                 else
  82.                                 {
  83.                                     setScripts += "," + keyName + "='" + recordsSource[primaryKeyValue][keyName] + "' ";
  84.                                 }
  85.                                 setScriptsIndex++;
  86.                             }
  87.                         }
  88.                     }
  89.                 }
  90.                 else
  91.                 {
  92.                     foreach (string keyName in columns)
  93.                     {
  94.                         if (!ignoreInsertColumns.Contains(keyName))
  95.                         {
  96.                             if (insertScriptsIndex == 0)
  97.                             {
  98.                                 insertKeysScripts += keyName;
  99.                                 insertValuesScripts += "'" + recordsSource[primaryKeyValue][keyName] + "' ";
  100.                             }
  101.                             else
  102.                             {
  103.                                 insertKeysScripts += "," + keyName;
  104.                                 insertValuesScripts += ",'" + recordsSource[primaryKeyValue][keyName] + "' ";
  105.                             }
  106.                             insertScriptsIndex++;
  107.                         }
  108.                     }
  109.                 }

  110.                 //update source to dest
  111.                 if (setScriptsIndex > 0)
  112.                 {
  113.                     cmd = new SqlCommand("Update " + tableName + " set " + setScripts + " where " + primaryKeyName + "='" + recordsSource[primaryKeyValue][primaryKeyName] + "'", destinationConnector);
  114.                     cmd.ExecuteNonQuery();
  115.                 }

  116.                 //insert source to dest
  117.                 if (insertScriptsIndex > 0)
  118.                 {
  119.                     cmd = new SqlCommand("insert into " + tableName + " (" + insertKeysScripts + ") values (" + insertValuesScripts + ")", destinationConnector);
  120.                     cmd.ExecuteNonQuery();
  121.                 }
  122.             }

  123.             //after update and insert, the count still not match, means we delete some records in source db, then we also need to delete the records in destination db
  124.             foreach (var re in recordsDest)
  125.             {
  126.                 //get the delete record primary key value
  127.                 if (!recordsSource.ContainsKey(re.Key))
  128.                 {
  129.                     cmd = new SqlCommand("delete from " + tableName + " where " + primaryKeyName + "='" + re.Value[primaryKeyName].ToString() + "'", destinationConnector);
  130.                     cmd.ExecuteNonQuery();
  131.                 }
  132.             }

  133.             // Close objects
  134.             destinationConnector.Close();
  135.             mySqlConn.Close();
  136.         }</span></font></font>
复制代码



代码的基础类其他部分请看下列文章:

1. C#同步SQL Server数据库中的数据--数据库同步工具[同步已有的有变化的数据]

2.分析下自己写的SQL Server同步工具的性能和缺陷

3.C#同步SQL Server数据库中的数据--数据库同步工具[同步新数据]

    4.C#同步SQL Server数据库Schema
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

大数据中国微信

QQ   

版权所有: Discuz! © 2001-2013 大数据.

GMT+8, 2024-11-15 21:12 , Processed in 0.073757 second(s), 24 queries .

快速回复 返回顶部 返回列表