SSIS迁移SQL Server脚本到MySQL报Connection must be valid and open错误
问题排查与解决方案
错误根因
你遇到的Connection must be valid and open报错,本质是MySQL .NET驱动的适配逻辑和SQL Server驱动不同导致:
- SSIS的ADO.NET连接管理器针对SQL Server的SqlClient驱动做了适配,调用
AcquireConnection返回的连接默认是打开状态;但MySQL官方的MySql.Data驱动没有做对应适配,拿到的连接实例默认处于关闭状态,直接执行SQL命令就会抛出该异常。 - 你的代码中额外存在逻辑冗余问题:每次遍历文件都重复实例化、获取连接,且使用完未主动释放连接,容易引发连接泄漏。
修复步骤
1. 核心连接状态修复
在获取MySQL连接实例后,新增连接状态判断和打开逻辑,修改对应代码段如下:
MySqlConnection myADONETConnection = (MySqlConnection)(Dts.Connections["DB_Conn_IBDRStagingDev"].AcquireConnection(Dts.Transaction) as MySqlConnection); // 新增连接打开判断 if (myADONETConnection.State != ConnectionState.Open) { myADONETConnection.Open(); }
2. 可选优化(推荐执行)
- 把连接获取逻辑移到
foreach (string fileName in fileEntries)循环外部,不需要每个文件都重复获取连接 - 所有文件处理完成后,主动释放连接资源:
Dts.Connections["DB_Conn_IBDRStagingDev"].ReleaseConnection(myADONETConnection);
- 逐行插入性能较差,且如果CSV内容包含单引号会触发SQL语法错误,建议替换为MySQL原生
LOAD DATA INFILE命令做批量导入,性能可提升10~100倍,同时避免SQL注入风险。
3. 单引号转义临时修复
如果暂时不想替换批量导入逻辑,需要在拼接SQL前对内容做单引号转义:
query += "VALUES('" + line.Replace(FileDelimiter, "','").Replace("'", "''") + "')";
内容的提问来源于stack exchange,提问作者dcfretwell
相关产品推荐
相关产品推荐

