调用SetComponentProperty时触发0xC0048021异常的问题咨询
问题:SSIS数据流组件设置SqlCommand时抛出COM异常(0xC0048021)
我尝试用Microsoft.SqlServer.Dts.Pipeline.Wrapper创建新数据流,参考了微软官方文档和Stack Overflow内容,但代码无法正常运行。代码如下:
Microsoft.SqlServer.Dts.Runtime.Package package = new Microsoft.SqlServer.Dts.Runtime.Package(); Microsoft.SqlServer.Dts.Runtime.Executable e = package.Executables.Add("STOCK:PipelineTask"); Microsoft.SqlServer.Dts.Runtime.TaskHost thMainPipe = e as Microsoft.SqlServer.Dts.Runtime.TaskHost; MainPipe dataflowTask = thMainPipe.InnerObject as MainPipe; IDTSComponentMetaData100 cmp = dataflowTask.ComponentMetaDataCollection.New(); cmp.ComponentClassID = "DTSAdapter.OleDbSource"; CManagedComponentWrapper dtSource = cmp.Instantiate(); dtSource.SetComponentProperty("SqlCommand", "select * from Production.Products");
执行最后一行时抛出异常:
Exception de HRESULT : 0xC0048021"} System.Runtime.InteropServices.COMException
这段代码直接复制自微软官方示例,但我搞不懂报错原因。我的环境是VS 2019、.NET 4.7、SQL 2019。想问两个问题:
- 当前开发阶段必须连接SQL服务器吗?目前服务器不可用。
- 是不是因为我没创建连接才导致的报错?
回答
- 报错0xC0048021的核心原因是你没有为OleDbSource组件关联数据库连接管理器。OleDbSource依赖连接管理器来确定数据源上下文,哪怕只是开发阶段设置属性,也需要先创建并关联对应的连接,否则组件无法识别
SqlCommand属性的有效性。 - 开发阶段不需要实际连接到SQL服务器,但必须先在代码中创建OleDb连接管理器并关联到OleDbSource组件。缺少这一步,组件无法初始化必要的元数据,就会抛出这个COM异常。
- 补充必要的代码步骤:
- 先创建OleDb连接管理器:
ConnectionManager cm = package.Connections.Add("OLEDB"); cm.ConnectionString = "你的OLEDB连接字符串(即使服务器不可用,格式正确即可)"; cm.Name = "OLEDB_Connection"; - 将连接管理器关联到OleDbSource组件:
cmp.RuntimeConnectionCollection[0].ConnectionManager = DtsConvert.GetExtendedInterface(cm); cmp.RuntimeConnectionCollection[0].ConnectionManagerID = cm.ID; - 调用
dtSource.AcquireConnections(null)初始化组件,之后再设置SqlCommand属性。
- 先创建OleDb连接管理器:
内容的提问来源于stack exchange,提问作者FRReg
相关产品推荐
相关产品推荐

