用C#写一个简单的数据同步Windows服务(一)

C# SqlBulkCopy sqlserver 批量更新数据 在开发中遇到了一张表的数据因为只做了同步插入而没有做同步更新的操作,导致了百万数据不准确。面对大量数据需要更新,传统的循环逐条插入以及拼接1000条数据插入都比较耗时,网上有博主做出了相关测试。     根据以上场景,新建控制台程序。config添加数据库连接配置,sqlHelper连接更新数据源,sqlBulkCopyHelper连接更新目标库。 1,注意三点:第一点是: String sqlstring = @""; 即String sqlstring = @"SELECT [order... 阅读详情

需求概述

从某中间数据库中取得指定的未同步的数据,同步到另一个库的某些表中。使用一个编号字段进行匹配,同步完成后将未同步的数据标识为已同步状态。该服务可定时自动执行。

设计理念

程序、数据、配置分开,以使功能更灵活。数据库操作类,使用通用的OldDB相关类,以增强兼容性。关键操作记录到日志中,以方便在出现问题时进行排查。

配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <appSettings>
    <add key="log" value="D:\Code_Zhangzhou\Code\CostMoniter\CostMoniter\bin\Debug\logs"/>
    <add key="fromdatabase" value="Provider=MSDAORA;Data Source=localhost/orcl;Persist Security Info=True;User ID=ZHANGZHOU;Password=zhangzhou"/>
    <add key="todatabase" value="Provider=MSDAORA;Data Source=localhost/orcl;Persist Security Info=True;User ID=ZHANGZHOU;Password=zhangzhou"/>
    <add key="fromtable" value="GH_MID_COST"/>
    <add key="totables" value="AAA,BBB"/>
    <add key="interval" value="8"/>
  </appSettings>
</configuration>

核心代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Data.OleDb;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.Timers;

namespace CostMoniter
{
    public partial class CostMonitorService : ServiceBase
    {
        public CostMonitorService()
        {
            InitializeComponent();
        }

        string filePath = "";

        protected override void OnStart(string[] args)
        {
            try
            {
                Log("Service Starts");
                long lInterval = 3000;
                string sInterval = ConfigurationSettings.AppSettings["interval"].ToString();
                long lIntervalConfig = 0;
                if (long.TryParse(sInterval, out lIntervalConfig) && lIntervalConfig > 0)
                    lInterval = lIntervalConfig * 1000;
                Timer t = new Timer();
                t.Interval = lInterval;
                t.Elapsed += new System.Timers.ElapsedEventHandler(CopyData);
                t.AutoReset = true;
                t.Enabled = true;
            }
            catch (Exception e)
            {
                Log(e.Message);
            }
        }

        public void Log(string s)
        {
            try
            {
                string folder = ConfigurationSettings.AppSettings["log"];
                if (!System.IO.Directory.Exists(folder) && null == System.IO.Directory.CreateDirectory(folder))
                    return;
                string fileName = string.Format("{0}.log", DateTime.Today.ToString("yyyy_MM_dd"));
                string filePath = System.IO.Path.Combine(folder, fileName);
                FileStream fileStream = new FileStream(filePath, FileMode.Append, FileAccess.Write);
                StreamWriter streamWriter = new StreamWriter(fileStream);
                streamWriter.WriteLine(string.Format("{0} -- {1}", DateTime.Now.ToString("HH:mm:ss"), s));
                streamWriter.Close();
                fileStream.Close();
            }
            catch { }
        }


        protected override void OnStop()
        {
            Log("Service Stops");
        }


        private void CopyData(object source, System.Timers.ElapsedEventArgs e)
        {
            string FromConnectionString = ConfigurationSettings.AppSettings["fromdatabase"];
            string ToConnectionString = ConfigurationSettings.AppSettings["todatabase"];

            OleDbConnection FromConnection = new OleDbConnection(FromConnectionString);
            OleDbConnection ToConnection = new OleDbConnection(ToConnectionString);

            try
            {
                FromConnection.Open();
                ToConnection.Open();

                List<string> ToTables = ConfigurationSettings.AppSettings["totables"].Split(',').ToList();
                string FromTable = ConfigurationSettings.AppSettings["fromtable"];
                string FromSelectCommandText = string.Format("SELECT GHCODE,ZBCOST,ZMCOST,ZSCOST FROM {0} WHERE ISGET=1 AND USEORNOT=1", FromTable);

                Log(string.Format( "Execute SQL : {0}",FromSelectCommandText));

                OleDbCommand FromSelectCommand = FromConnection.CreateCommand();
                FromSelectCommand.CommandText = FromSelectCommandText;

                OleDbDataReader FromDataReader = FromSelectCommand.ExecuteReader();
                if (FromDataReader.HasRows)
                {
                    while (FromDataReader.Read())
                    {
                        string sCode = FromDataReader[0].ToString();
                        if (string.IsNullOrEmpty(sCode))
                            continue;

                        string ZhengDi = FromDataReader[1].ToString();
                        string ZaoDi = FromDataReader[2].ToString();
                        string XiaoShou = FromDataReader[3].ToString();

                        foreach (string ToFeatureClass in ToTables)
                        {
                            string ToUptateCommandText = string.Format("UPDATE {0} SET ZHENGDICB={1},ZAODICB={2},XIAOSHOUSY={3} WHERE MARKS={4}", ToFeatureClass, ZhengDi, ZaoDi, XiaoShou, sCode);
                            Log(string.Format( "Execute SQL : {0}",ToUptateCommandText));
                            OleDbCommand ToCommand = ToConnection.CreateCommand();
                            ToCommand.CommandText = ToUptateCommandText;
                            int ToRowCount = ToCommand.ExecuteNonQuery();
                            Log(string.Format("{0} Row(s) Updated",ToRowCount));
                                
                        }
                    }
                }
                string FromUpdateCommandText = string.Format("UPDATE {0} SET ISGET=2 WHERE ISGET=1 AND USEORNOT=1", FromTable);
                Log(string.Format( "Execute SQL : {0}",FromUpdateCommandText)) ;
                OleDbCommand FromUpdateCommand = FromConnection.CreateCommand();
                FromUpdateCommand.CommandText = FromUpdateCommandText;
                int FromRowCount = FromUpdateCommand.ExecuteNonQuery();
                if (0 == FromRowCount)
                    Log("No Rows Synchronized");
                else
                    Log(string.Format("{0} Row(s) Synchronized",FromRowCount));
            }
            catch (Exception ex)
            {
                Log("ERROR : " + ex.Message);
            }
            finally
            {
                Log("Finished");
                FromConnection.Close();
                ToConnection.Close();
            }
        }

    }
}

服务名称


注册与卸载脚本

注册(install.bat)

%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe D:\abc\CostMoniter.exe
Net Start CostMoniter
sc config CostMoniter start= auto
pause

卸载(Uninstall.bat)

%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u D:\abc\CostMoniter.exe
pause
C#同步SQL Server数据库中的数据--数据库同步工具[同步已有的有变化的数据] 阅读详情

相关推荐

C#写Windows服务

一、如何用VS创建Windows服务 1、新建C# Windows服务:windows service工程 2、新建windows service工程后,系统自动生成一个Service1.cs文件,默认是其设计视图。选择查看其代码,默认有构造函数、OnStart、OnStop三个函数 3、新建了C# Windows服务之后,还要设置该服务运行的周期,左侧的ToolBox中有两个timmer,

from.Begin();to.End(); 3333

C#——数据同步方法

序 数据同步是并发编程不可避免的话题,今天我们就来谈谈C#中的数据同步方法。 进程内数据同步 数据主要通过同步原语来进行同步,先来看看C#中的两种最简单的数据同步方式 (1)lock关键字 lock关键字很简单,简单的解析是一锁,当有一个线程持有这把锁时,其他线程不能进入这个“锁”区域,C#中表现这个区域为一个{}块,学术上称作临界区(critical  region)。 例子如下:

心清的专栏 9426

C# 开发 Windows 服务实例详解

Windows服务是Windows操作系统中的一种后台进程,它不需要用户登录即可运行,并且可以执行如监控硬件状态、提供网络服务等任务。与常规应用程序不同,服务通常在用户无法看到的环境中运行,为系统和应用程序提供支持。对于IT行业来说,理解和应用Windows服务是构建稳定、可靠系统的关键。服务可以实现特定功能,如网络服务、系统监控、数据库管理等,而且不需要用户登录即可运行。开发Windows服务可以使用多种工具和语言,如C#结合.NET框架。

weixin_42405592的博客 1442

C#实现SqlServer数据库同步

2. 根据不同的配置文件,加载不同的模式,多驱动(Drivers 1主1备-单向同步,1主1主-双向同步,2主1备-多库汇总),多机同步(DstConnect),多库同多表同步(SrcMap,dbsync2|*表示监听该数据库下的所有表),设置刷新时间(RefreshTime),是否启用(Enable),是否重置cdc数据(SrcUpdateCDC)// 查询cdc时间。Program.AddLog($"添加,dst:{dst},sql:{sql_cdc_execute}");// 主键,用于更新删除。

arno1988的专栏 3414

C# 把一个数据库的信息上传至另一数据库操作

用ADO 在两个不同数库信息转发 一个数据库操作不错的实例

THUCNews新闻文本分类-tfidf+sklearn

本文使用的是和鲸社区现有数据集,代码也在和鲸社区公开,fork之后可以直接运行。 本文中所用的数据集清华NLP组提供的THUCNews新闻文本分类数据集的一个子集(原始的数据集大约74万篇文档,训练起来需要花较长的时间)。 本次训练使用了其中的体育, 财经, 房产, 家居, 教育, 科技, 时尚, 时政, 游戏, 娱乐10个分类,每个分类6500条,总共65000条新闻数据。项目在和鲸社区的平台上跑的,数据集直接引用了和鲸的数据集,每个分类6500条,总共65000条新闻数据。 数据集划分如下: cnews

wmq104的博客 4591

用C#写一个简单的数据同步Windows服务(二)

本文主要介绍已经写好的数据同步Windows服务的部署说明。一、 部署包至少包括*.exe可执行文件、*.exe.config配置文件、Intall.bat安装脚本、Unintall.bat卸载脚本四个文件。 二、 配置项配置文件的配置项说明:1. 配置文件的appSettings标签下保存本服务常用且必需的配置项。 2. log项为日志文件的存放路径(绝对路径,下同),如配置的文件夹不存在,服务...

a_dev的专栏 3997

目标检测技术的发展:从R-CNN、YOLO到DETR、DINO

OV-DINO的出现标志着在开放域目标检测领域的重大进步,其在处理未见过的物体类别时的能力得到了显著提升。这项技术对于需要适应未知或变化环境的应用具有重要意义,如自动驾驶、机器人视觉、安防监控等。

DeepAIedu的博客 2631

C# 创建一个简单的Windows服务

有时候需要在服务器上长时间运行一些小程序,除了WinForm外,还可以运行Windows服务。相比WinForm,Windows服务更稳定。 Windows服务介绍 Microsoft Windows 服务能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这使服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用。还可以在不同于登录用户的特定用户帐户或.

weixin_42281203的博客 2334

海康工业相机BayerRG8转BGR8实战:手把手教你用OpenCV实现高效图像转换

本文详细解析了海康工业相机BayerRG8格式到BGR8格式的高效转换实战。针对工业视觉项目中高帧率、大分辨率场景下的性能瓶颈,文章对比了海康SDK原生方案与OpenCV多种转换方法的优劣,并提供了从基础实现到高级优化(如多线程流水线、内存管理、SIMD指令集应用)的完整代码示例与性能调优策略,帮助开发者构建稳定、高效的图像处理系统。

weixin_29237635的博客 524

Win10系统VS2019+Cmake+qhull_8.0.0环境配置

1 qhull 1.1 简要介绍 qhull是一个强大的计算几何库,可以用于计算高维的convex hull, Delaunay triangulation, Voronoi diagram等。 1.2 依赖库 qhull不依赖其他库。 1.3 源码包下载 qhull源码地址:github:https://github.com/qhull/qhull.git 2 Cmake构建项目 2.1 路径 源代码路径:D:/ThirdParty/qhull/qhull_8.0.0构建项目路径:D:/Thi.

wangchenxue的博客 2492

使用C#写一个Windows服务

C#创建一个Windows服务,可以通过其他计算机访问。

学贵有恒 6972

二、FM1288调试方案-工具软件使用

分析音频数据的软件需要满足以下几点:1、能打开原始pcm音频文件;2、基本的音频播放软件的操作;3、能查看分析音频数据的频率成分;4、能查看分析音频音量幅度;5、能完成基本音频处理:降噪、音量增幅限幅、滤波和均衡;

优快云mianfeixiazai001的博客 1294

C#写Windows Service(windows服务程序)

背景:        要学习使用一个新东西,我们必须知道他是个什么东西。对于我们此次研究的windows服务来说,他又是个什么东西,其实也没有什么高深的了。 windows service概述:        一个Windows服务程序是在Windows操作系统下能完成特定功能的可执行的应用程序。Windows服务程序虽然是可执行的,但是它不像一般的可执行文件通过点击一下就直接可

Davie's Happy Life 5198

AI Agent Harness Engineering 的“热插拔”能力:模块化设计思路

本文我会结合我在大厂做AI Agent平台的实战经验,从核心概念、架构设计、代码实现、落地实战多个维度,给大家详细讲解AI Agent Harness Engineering的核心能力——热插拔的模块化设计思路。我们会从问题根源出发,一步步搭建一个完整的支持热插拔的Agent Harness框架,包含组件抽象、注册中心、生命周期管理、配置驱动、容错机制等核心模块。

AI天才研究院 503

嵌入式内存管理之“LittleFS文件系统”开发(附LittleFS项目源码)

本文介绍了如何在嵌入式系统中实现 LittleFS 文件系统,并结合 Flash 存储进行数据管理。通过详细的代码示例,展示了如何配置、挂载 LittleFS 文件系统,并进行文件操作,如读取、写入和更新数据。特别地,博客通过实际应用演示了如何实现启动计数功能,以及如何处理文件系统的格式化和挂载过程。该示例帮助读者掌握在资源受限的嵌入式环境中实现高效文件存储管理的关键技术。

Bit_Dong的博客 3188

用C#编写一个Windows服务程序

1.添加引用Windows服务(.NET Framework) 2.输入项目名称,选择安装位置,选择安装框架版本;创建。 3.找到Form设计窗体,添加控件如图。控件工具箱在菜单栏–>视图–>找到‘工具箱’。

zkjd111的博客 6712

OpenCASCADE:写IGES

OpenCASCADE:写IGES程序涵盖的领域流程说明初始化过程设置翻译参数执行 Open CASCADE Technology 形状转换编写 IGES 文件将开放级联技术形状映射到 IGES 实体曲线表面拓扑实体——人脸模式下的平移公差管理在 IGES 文件中设置分辨率代码架构调用图例子 程序 您可以通过以下步骤将 OCCT 形状转换为 IGES 实体: 初始化进程。 设置翻译参数, 执行模型翻译, 写入输出 IGES 文件。 您可以在写入文件之前转换多个形状。每个形状都将是 IGES 模型中的根实体。

希望我的博客,能帮上你解决学习中工作中所遇到的问题 923

C#写一个Windows服务开机自动启动另一个服务

如果有一个应用程序,想要在电脑开机的时候自动启动(即使用户未登录Windows也要启动),可以用Windows服务来实现,我只是很简单的尝试了一下,由于前段时间做的一个办公QQ,在服务器端需要始终运行一个控制台程序来监听各种消息,但不能每次开机手动去启动这个控制台程序,所以就写了一个Windows服务,我用VS2008写的,以下是简单做法: 先在VS中创建一个Windows服务的项目,在自动生成的service1.cs文件里添加如下语句: string StartAppPath = @“C:\Program

zq9955的博客 1351

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

用C#写一个简单的WINDOWS服务程序

服务程序在C#中的写法。        1.在VS.NET2003中新建一个WINDOWS服务程序的项目WinSrv_A。        2.更改SERVICE1.CS属性SERVICENAME为你所要建立的服务名称,在服务管理器->名称中你可以看到你的服务名        3.按F7进入代码窗口,里面有2个重载函数是你要在其中写代码的一个是            //protected over

末世纪狂潮 2410

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

让你写的c#程序一开机就自动运行 Windows服务实现开机启动

如果有一个应用程序,想要在电脑开机的时候自动启动(即使用户未登录Windows也要启动),可以用Windows服务来实现,我只是很简单的尝试了一下,由于前段时间做的一个办公QQ,在服务器端需要始终运行一个控制台程序来监听各种消息,但不能每次开机手动去启动这个控制台程序,所以就写了一个Windows服务,我用VS2008写的,以下是简单做法: 先在VS中创建一个Windows服务的项目,在自动生成的...

KuangPu_001的博客 4521

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C# 写一个简单的Windows Service的服务程序

在出现的"ProjectInstaller.cs[Design]"中的serviceInstall1属性中的ServiceName中设定你想要的名字,例如我设定的名字叫Tody;在出现的"ProjectInstaller.cs[Design]"中的serviceProcessInstaller1属性中的Account中选择“LocalSystem”如下为Service1的类,这是我们可以在OnStart和OnStop的函数中增加我们的代码;在系统服务中找到Tody的服务,如下图,右击启动。

Tody Guo的专栏 1234

.Net Windows服务(一):VS快速创建一个简单Windows服务

在项目中经常会遇见一些电脑开机就需要运行服务去处理事情这样的需求,那么这里简单记录一下创建一个服务的简单流程(服务任务:记录开机时间与开机登录用户到指定文件中)     1、创建Windows项目srvWatchComputer,并把Service1.cs改成WatchComputer 2、在WatchComputer的设计视图中拖入控件EventLog,用于记录日志(此处可以添

hexianghong888的专栏 1798

C# 写一个简单的Windows服务

在VS中新建一个项目 Visual C#->Windows->经典桌面->Windows服务 大致功能:一个socket服务端,收到客户端的请求后,随机从txt读取一行发送到客户端新建一个QuoteService的服务 用到的类 QuoteServer.csusing System; using System.Collections.Generic; using System.Diagnost

Bell_Lu的博客 863

c#写windows服务

序言 前段时间做一个数据迁移项目,刚开始用B/S架构做的项目,但B/S要寄存在IIs中,而IIs又不稳定因素,如果重启IIs就要打开页面才能运行项目。有不便之处,就改用Windows服务实现。这篇就总结下,windows服务的编写,调试,安装卸载。 Windows服务介绍 Microsoft Windows 服务能够创建在它们自己的 Windows 会话中可长时间运行的可

想透彻,说明白,写清楚 572
上一篇: 地籍数据属性质检功能设计与实现(改进)
下一篇: 用C#写一个简单的数据同步Windows服务(二)
acngiser
博客等级 码龄15年 118粉丝 214原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值