SSIS数据流C#脚本组件变量传值为null的问题排查
SSIS脚本组件调用API空引用异常修复方案
问题场景
在For Each循环的SSIS数据流中调用API时遇到空引用错误:
- 流程步骤:
- 获取未地理编码的标识键列表
- 根据标识键执行SQL查询获取经纬度,传入
User::LatLon变量 - 通过表达式拼接基础API URL、
User::LatLon和API密钥,生成User::GeoApifyURL变量
- 异常表现:表达式生成的URL在浏览器中可正常返回数据,但脚本组件报错:
[ScriptMain] Error: Object reference not set to an instance of an object.
根因诊断
脚本代码存在变量作用域错误:
- 类级别定义了私有变量
url和filename,但在PreExecute方法内重新声明了同名局部变量(而非给类变量赋值),导致类变量始终未初始化。 - 后续
CreateNewOutputRows方法尝试使用未赋值的类变量,触发空引用异常。
修复步骤
错误代码示例(问题所在)
public class ScriptMain : UserComponent { // 类级别变量 private string url; private string filename; public override void PreExecute() { base.PreExecute(); // 错误:重新声明局部变量,类变量未被赋值 string url = Variables.GeoApifyURL; string filename = Variables.OutputFileName; } public override void CreateNewOutputRows() { // 使用未初始化的类变量url,触发空引用 using (var client = new WebClient()) { string response = client.DownloadString(url); // ...后续逻辑 } } }
修正后代码
移除PreExecute方法内的变量声明,直接给类级别变量赋值:
public class ScriptMain : UserComponent { // 类级别变量 private string url; private string filename; public override void PreExecute() { base.PreExecute(); // 正确:直接给类变量赋值,无局部变量声明 url = Variables.GeoApifyURL; filename = Variables.OutputFileName; } public override void CreateNewOutputRows() { using (var client = new WebClient()) { string response = client.DownloadString(url); // ...后续逻辑 } } }
注意:
PreExecute方法在组件运行时仅执行一次,类变量会在数据流每行处理时保留,该修正既解决空引用问题,也符合SSIS脚本组件的执行逻辑。
内容的提问来源于stack exchange,提问作者jcbooth
相关产品推荐
相关产品推荐

