Read Registry Key in Script Task

本文介绍如何在SSIS作业中预先检查注册表设置TypeGuessRows的值,以确保从Excel导入数据时的数据类型判断准确性。通过新建变量并使用Script Task组件,可以实现对注册表值的读取,并据此决定SSIS作业是否继续执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇谈到读取excel的时候,通过修改注册表值的办法来提高判断数据类型的准确性

http://blog.youkuaiyun.com/u012988208/article/details/52192049


但是,修复/重新安装office,安装AccessDatabaseEngine,都会造成TypeGuessRows的值会重新被改写回默认值8.

那么有什么办法在SSIS作业前进行检查,事先读取注册表值呢?


1.新建Variable:TypeGuessRows. 方便breakpoint测试。

2.在Script Task当中添加引用命名空间 using Microsoft.Win32;

3.修改主方法如下:

	public void Main()
	{
            Dts.Variables["TypeGuessRows"].Value = (int)Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel").GetValue("TypeGuessRows");

            if ((int)Dts.Variables["TypeGuessRows"].Value == 0)
            {
                Dts.TaskResult = (int)ScriptResults.Success;
            }
            else 
            {
                Dts.TaskResult = (int)ScriptResults.Failure;
            }

			
	}

3. 遇sucess则进行后续作业,遇failure则发邮件通知管理员出错




import asyncio import json import logging import time import sys import os from datetime import datetime, timezone from pymodbus.client import AsyncModbusTcpClient from core.modbus_reader import read_slave_data from core.redis_storage import RedisStorage # 初始化日志 logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler("future_ems/modbus_collector.log"), logging.StreamHandler() ] ) logger = logging.getLogger("ModbusCollector") def load_config(config_path=None): """加载配置文件""" if config_path is None: config_path = os.path.join(os.path.dirname(__file__), "config", "config.json") try: with open(config_path, "r", encoding="utf-8-sig") as f: # 处理BOM config = json.load(f) logger.info("配置文件加载成功") return config except Exception as e: logger.error(f"配置文件加载失败: {str(e)}") return None async def create_modbus_clients(slave_configs): """创建Modbus客户端连接""" clients = {} for slave in slave_configs: key = (slave["host"], slave["port"]) if key not in clients: try: client = AsyncModbusTcpClient(host=slave["host"], port=slave["port"]) await client.connect() if client.connected: clients[key] = client logger.info(f"已连接到 {slave['host']}:{slave['port']}") else: logger.error(f"无法连接到 {slave['host']}:{slave['port']}") clients[key] = None except Exception as e: logger.error(f"创建客户端失败: {str(e)}") clients[key] = None return clients async def read_all_slave_data(clients, slave_configs): """并发读取所有从站数据""" tasks = [] for slave in slave_configs: key = (slave["host"], slave["port"]) client = clients.get(key) if client and client.connected: tasks.append(read_slave_data(client, slave)) else: tasks.append(asyncio.create_task(fake_failed_slave_data(slave))) return await asyncio.gather(*tasks) async def store_data_to_redis(redis_storage, results): """将数据存储到Redis""" store_tasks = [redis_storage.store_slave_data(result) for result in results] return await asyncio.gather(*store_tasks) async def close_modbus_clients(clients): """安全关闭所有Modbus客户端连接""" for key, client in clients.items(): if client is None: logger.debug(f"连接对象为空,跳过关闭: {key[0]}:{key[1]}") continue try: # 检查客户端是否仍有有效连接 if hasattr(client, 'connected') and client.connected: logger.debug(f"正在关闭连接: {key[0]}:{key[1]}") await client.close() logger.debug(f"已关闭连接: {key[0]}:{key[1]}") else: logger.debug(f"连接已关闭或不活跃,无需操作: {key[0]}:{key[1]}") except Exception as e: logger.error(f"关闭连接 {key[0]}:{key[1]} 失败: {str(e)}") async def monitoring_loop(): """主监控循环""" logger.info("启动多从站监控系统(支持float16/float32/bit/coil)") # 加载配置 config = load_config() if not config: return # 初始化Redis redis_storage = RedisStorage(config["REDIS_CONFIG"]) redis_ready = await redis_storage.init_connection() if not redis_ready: logger.critical("无法初始化Redis连接,退出程序") return SLAVE_CONFIGS = config["SLAVE_CONFIGS"] while True: start_time = time.time() clients = {} # 确保每次循环都重新初始化客户端字典 try: # 创建Modbus客户端连接 clients = await create_modbus_clients(SLAVE_CONFIGS) # 并发读取所有从站 results = await read_all_slave_data(clients, SLAVE_CONFIGS) # 存储到Redis store_results = await store_data_to_redis(redis_storage, results) success_count = sum(1 for r in store_results if r) logger.info( f"完成数据采集与存储,成功: {success_count}/{len(SLAVE_CONFIGS)},耗时: {time.time() - start_time:.2f}秒") except Exception as e: logger.error(f"监控循环异常: {str(e)}", exc_info=True) finally: # 安全关闭所有客户端连接 await close_modbus_clients(clients) # 控制采集周期 elapsed = time.time() - start_time delay = max(0, 5 - elapsed) await asyncio.sleep(delay) # 添加辅助函数处理连接失败的从站 async def fake_failed_slave_data(slave_config: dict) -> dict: return { "slave": slave_config["name"], "success": False, "error": "客户端连接失败", "timestamp": datetime.now(timezone.utc).isoformat() } async def main(): """主程序入口""" try: await monitoring_loop() except KeyboardInterrupt: logger.info("程序被用户中断") finally: # 关闭Redis连接 # 注意:实际Redis关闭在RedisStorage类中处理 pass if __name__ == "__main__": try: asyncio.run(main()) except KeyboardInterrupt: print("\n程序被用户主动终止") sys.exit(0) 这是源代码,请你直接给我修改就行了
07-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值