狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

使用 C# 和 SQL Server 實現數據庫的實時數據同步

admin
2024年10月30日 7:37 本文熱度 483

在現代應用程序中,及時更新不同數據庫之間的數據至關重要。本文將介紹如何在 SQL Server 中使用 C# 實現數據的實時同步。我們將使用 SQLDependency 類來監聽數據庫表的變化,并將這些變化實時地同步到另一張表中。

前提條件

在開始之前,請確保已經設置好兩個 SQL Server 數據庫:

  • SourceDB: 包含你需要監聽的表。

  • TargetDB: 目標數據庫,用于同步數據。

配置 SQL Server

首先,需要啟用 SQL Server 的查詢通知服務,以便支持 SQLDependency。請使用以下命令啟用數據庫服務代理:

查看

SELECT name, is_broker_enabled  FROM sys.databases;  
ALTER DATABASE SourceDB SET ENABLE_BROKER;

編寫 C# 程序

下面的 C# 程序將使用 SQLDependency 來監聽 SourceDB 中的 SourceTable 表的變化。我們將在數據插入時同步到 TargetDB 中的 TargetTable

程序代碼

using System;using System.Data;using System.Data.SqlClient;using System.Configuration;
class Program{    private static bool _continueRunning = true;
   static void Main()    {        Console.WriteLine("數據同步程序已啟動。按 'Q' 鍵退出。");
       // 設置連接字符串          string sourceConnectionString = ConfigurationManager.ConnectionStrings["SourceDB"].ConnectionString;        string targetConnectionString = ConfigurationManager.ConnectionStrings["TargetDB"].ConnectionString;
       // 啟用 SQLDependency          SqlDependency.Start(sourceConnectionString);
       try        {            while (_continueRunning)            {                try                {                    using (SqlConnection sourceConnection = new SqlConnection(sourceConnectionString))                    {                        sourceConnection.Open();                        StartListening(sourceConnection);
                       // 保持連接打開狀態                          while (_continueRunning)                        {                            if (Console.KeyAvailable)                            {                                var key = Console.ReadKey(true).Key;                                if (key == ConsoleKey.Q)                                {                                    _continueRunning = false;                                    break;                                }                            }                            Thread.Sleep(100);                        }                    }                }                catch (Exception ex)                {                    Console.WriteLine($"發生錯誤: {ex.Message}");                    Console.WriteLine("5秒后重試...");                    Thread.Sleep(5000);                }            }        }        finally        {            SqlDependency.Stop(sourceConnectionString);            Console.WriteLine("數據同步程序已停止。");        }    }
   private static void StartListening(SqlConnection connection)    {        using (SqlCommand command = new SqlCommand("SELECT ID, Name, Value, Created_Time FROM dbo.t1", connection))        {            SqlDependency dependency = new SqlDependency(command);            dependency.OnChange += new OnChangeEventHandler(OnDataChange);
           using (SqlDataReader reader = command.ExecuteReader())            {                // 初次加載數據處理              }        }    }
   private static void OnDataChange(object sender, SqlNotificationEventArgs e)    {        if (e.Info == SqlNotificationInfo.Insert)        {            Console.WriteLine("數據已插入。事件類型: " + e.Info.ToString());            SyncData();        }
       // 重新啟用監聽          string sourceConnectionString = ConfigurationManager.ConnectionStrings["SourceDB"].ConnectionString;        using (SqlConnection sourceConnection = new SqlConnection(sourceConnectionString))        {            sourceConnection.Open();            StartListening(sourceConnection);        }    }
   private static void SyncData()    {        string sourceConnectionString = ConfigurationManager.ConnectionStrings["SourceDB"].ConnectionString;        string targetConnectionString = ConfigurationManager.ConnectionStrings["TargetDB"].ConnectionString;
       using (SqlConnection sourceConnection = new SqlConnection(sourceConnectionString))        using (SqlConnection targetConnection = new SqlConnection(targetConnectionString))        {            sourceConnection.Open();            targetConnection.Open();
           // 獲取最新插入的數據            SqlCommand fetchDataCommand = new SqlCommand("SELECT TOP 1 * FROM t1 ORDER BY Created_Time DESC", sourceConnection);            using (SqlDataReader dataReader = fetchDataCommand.ExecuteReader())            {                if (dataReader.Read())                {                    Guid id = (Guid)dataReader["ID"];                    string name = (string)dataReader["Name"];                    decimal value = (decimal)dataReader["Value"];                    DateTime created_time = (DateTime)dataReader["created_time"];
                   // 將數據插入到 TargetTable                    SqlCommand insertCommand = new SqlCommand("INSERT INTO t1 (ID, Name, Value,Created_Time) VALUES (@ID, @Name, @Value,@Created_Time)", targetConnection);                    insertCommand.Parameters.AddWithValue("@ID", id);                    insertCommand.Parameters.AddWithValue("@Name", name);                    insertCommand.Parameters.AddWithValue("@Value", value);                    insertCommand.Parameters.AddWithValue("@Created_Time", created_time);
                   insertCommand.ExecuteNonQuery();                }            }        }    }}

增加更新后同步

private static void SyncUpdatedData(){    string sourceConnectionString = ConfigurationManager.ConnectionStrings["SourceDB"].ConnectionString;    string targetConnectionString = ConfigurationManager.ConnectionStrings["TargetDB"].ConnectionString;
   using (SqlConnection sourceConnection = new SqlConnection(sourceConnectionString))    using (SqlConnection targetConnection = new SqlConnection(targetConnectionString))    {        sourceConnection.Open();        targetConnection.Open();
       // 獲取最近更新的數據          // 注意:這里假設你有一個 Last_Updated_Time 字段來跟蹤更新時間          SqlCommand fetchDataCommand = new SqlCommand("SELECT TOP 1 * FROM t1 ORDER BY Last_Updated_Time DESC", sourceConnection);        using (SqlDataReader dataReader = fetchDataCommand.ExecuteReader())        {            if (dataReader.Read())            {                Guid id = (Guid)dataReader["ID"];                string name = (string)dataReader["Name"];                decimal value = (decimal)dataReader["Value"];                DateTime last_updated_time = (DateTime)dataReader["Last_Updated_Time"];
               // 更新目標表中的數據                  SqlCommand updateCommand = new SqlCommand(                    "UPDATE t1 SET Name = @Name, Value = @Value, Last_Updated_Time = @Last_Updated_Time  WHERE ID = @ID",                    targetConnection);                updateCommand.Parameters.AddWithValue("@ID", id);                updateCommand.Parameters.AddWithValue("@Name", name);                updateCommand.Parameters.AddWithValue("@Value", value);                updateCommand.Parameters.AddWithValue("@Last_Updated_Time", last_updated_time);
               int rowsAffected = updateCommand.ExecuteNonQuery();                if (rowsAffected > 0)                {                    Console.WriteLine($"已同步更新的數據: ID={id}, Name={name}, Value={value}, Created_Time={last_updated_time}");                }                else                {                    Console.WriteLine($"未找到要更新的記錄: ID={id}");                }            }        }    }}


配置文件 (App.config)

確保在你的項目中包含一個配置文件來管理數據庫連接字符串。

<?xml version="1.0" encoding="utf-8" ?><configuration>    <connectionStrings>        <add name="SourceDB" connectionString="Data Source=your_source_server;Initial Catalog=SourceDB;Integrated Security=True" />        <add name="TargetDB" connectionString="Data Source=your_target_server;Initial Catalog=TargetDB;Integrated Security=True" />    </connectionStrings></configuration>

關鍵點說明

  • SQLDependency: 通過 SQLDependency 監聽數據表變化,允許我們對 SourceTable 進行實時監聽。當數據更改時自動觸發 OnChange 事件。

  • 重新開啟監聽: 數據變化后,必須重新啟動監聽,以確保程序在后續的變化中繼續有效。


注意事項

  • 確保在 SQL Server 上啟用查詢通知和服務代理。

  • SQLDependency 適用于簡單查詢,不能包括復雜查詢、聯接或聚合。

  • 如果項目對性能和實時性要求較高,建議結合其他工具或技術方案,如 Change Tracking 或 Change Data Capture 等。


通過以上步驟,你可以實現對 SQL 數據庫變化的實時監聽和數據同步,從而保持數據庫之間的數據一致性和實時性。


該文章在 2024/10/30 15:06:16 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved