如何在C#中根据SQL插入/更新操作触发对应数据同步函数?
如何根据SQL操作类型控制调用Insert/Update函数?
我现在需要把一个数据库表的数据插入或更新到另一个数据库表,已经写了
InsertFields和UpdateFields两个函数。但现在服务启动时会同时调用这两个函数,我希望能根据SQL操作类型来控制程序流向——执行插入操作时只调用InsertFields,执行更新操作时只调用UpdateFields。以下是我的C#代码:
//When service starts controls comes to this block public ESS_VMint() { dLib = new DataLibrary("ESS", false, out essStatus); dLib = new DataLibrary("VillageMate", false, out villagemateStatus); InsertFields(); UpdateFields(); } public DataTable InsertFields() { //Insert operations } public DataTable UpdateFields() { //Update Operations }
针对你的需求,我整理了几种实用的解决方案,你可以根据自己的场景选择:
方案1:通过构造函数参数明确指定操作类型
这种方式最直接,通过给构造函数加一个操作类型参数,在实例化类的时候就能决定要执行插入还是更新。
首先定义一个枚举来规范操作类型,让代码可读性更强:
public enum SqlOperationType { Insert, Update }
然后修改你的构造函数,根据传入的类型调用对应函数:
public ESS_VMint(SqlOperationType operationType) { dLib = new DataLibrary("ESS", false, out essStatus); dLib = new DataLibrary("VillageMate", false, out villagemateStatus); switch(operationType) { case SqlOperationType.Insert: InsertFields(); break; case SqlOperationType.Update: UpdateFields(); break; default: throw new ArgumentOutOfRangeException(nameof(operationType), "不支持的SQL操作类型"); } }
之后启动服务时,只要指定操作类型就行:
// 要执行插入操作时 var essVmInsert = new ESS_VMint(SqlOperationType.Insert); // 要执行更新操作时 var essVmUpdate = new ESS_VMint(SqlOperationType.Update);
方案2:通过配置文件动态切换操作类型
如果希望不用修改代码就能切换操作逻辑,可以把操作类型放在配置文件里,程序启动时读取配置来决定调用哪个函数。
比如在appsettings.json里加一段配置:
{ "SqlOperation": { "CurrentOperation": "Insert" // 改成"Update"就能切换到更新逻辑 } }
然后修改构造函数读取配置:
// 需要引入Microsoft.Extensions.Configuration包来读取配置 private readonly IConfiguration _config; public ESS_VMint(IConfiguration config) { _config = config; dLib = new DataLibrary("ESS", false, out essStatus); dLib = new DataLibrary("VillageMate", false, out villagemateStatus); var operation = _config["SqlOperation:CurrentOperation"]?.Trim(); if(string.Equals(operation, "Insert", StringComparison.OrdinalIgnoreCase)) { InsertFields(); } else if(string.Equals(operation, "Update", StringComparison.OrdinalIgnoreCase)) { UpdateFields(); } else { throw new InvalidOperationException($"配置的操作类型{operation}不合法,请检查appsettings.json"); } }
这种方式的优势是不用重新编译代码,改配置文件就能切换操作,适合需要灵活调整的场景。
方案3:让程序自动判断(根据数据存在性选择插入/更新)
如果你的需求是自动根据目标表是否有对应数据来选择插入或更新(也就是Upsert操作),可以在构造函数里先做查询判断,再调用对应函数:
public ESS_VMint() { dLib = new DataLibrary("ESS", false, out essStatus); dLib = new DataLibrary("VillageMate", false, out villagemateStatus); // 根据你的业务主键查询目标表,判断数据是否已存在 bool isDataExist = CheckTargetDataExists(); if(isDataExist) { UpdateFields(); } else { InsertFields(); } } // 新增一个判断数据是否存在的辅助函数 private bool CheckTargetDataExists() { // 这里写你的查询逻辑,比如根据主键计数 string checkQuery = "SELECT COUNT(1) FROM YourTargetTable WHERE PrimaryKeyColumn = @PrimaryKeyValue"; // 用dLib执行查询并返回结果 // 示例(根据你的DataLibrary实现调整): var count = dLib.ExecuteScalar(checkQuery, new { PrimaryKeyValue = YourSourceData.PrimaryKey }); return (int)count > 0; }
这种方式适合不需要人工干预,程序自动处理数据同步的场景。
内容的提问来源于stack exchange,提问作者Saif AK
相关产品推荐
相关产品推荐

