IDataParameter InvalidCastException

时间:2014-04-22 10:32:58

标签: c# teradata

Microsoft企业库数据访问应用程序块包含以下方法:

private static IDataParameter[] CreateParameterCopy(DbCommand command)
{
    IDataParameterCollection parameters = (IDataParameterCollection)command.Parameters;
    IDataParameter[] parameterArray = new IDataParameter[parameters.Count];
    parameters.CopyTo(parameterArray, 0);

    return CachingMechanism.CloneParameters(parameterArray);
}

如果command.ParametersTdParameterCollection(实现IDataParameterCollection的Teradata .NET提供程序类),则parameters.CopyTo(parameterArray, 0)会抛出InvalidCastException:"无法转换对象类型System.Data.IDataParameter []键入Teradata.Client.Provider.TdParameter []"。

我的第一个问题:

这是怎样以及为什么会发生这种情况?

异常消息表明参数已成功复制到parameterArray,但之后尝试将parameterArray从IDataParameter []转换为TdParameter []。 (无论如何,TdParameter实现了IDataParameter。)

我的第二个问题:

如何在不使用具体类型的情况下解决这个问题?

1 个答案:

答案 0 :(得分:1)

问题出在CopyTo方法的内部代码中。

MSDN说:

  

源ICollection的类型不能自动转换为目标数组的类型。

这意味着数组必须能够在没有显式转换的情况下进行转换。否则方法调用将失败。

您应该使用CopyTo而不是使用foreach,而是逐个手动复制。