ADODB.Recordset从C#dll返回为null

时间:2013-01-02 18:24:03

标签: c# ms-access-2007 adodb

我创建了一个在MS Access中使用的C#dll。一切都适用于我的开发机器。 C#dll的返回类型为ADODB.Recordset的方法。我已将返回的记录集与MS Access表单绑定,并且它在我的开发计算机上运行良好。

问题是当我在另一台计算机上使用安装程序安装dll并运行MS Access应用程序时。没有错误,但它始终返回null记录集。我检查了MS Access中的引用,它引用了我的自定义DLL和Microsoft ActiveX Data Objects 2.1库,并且调用C#方法时没有错误。返回数组和字符串的其他方法工作正常,只有ADODB.Recordset作为返回类型的方法才有这个问题。

我的开发机器:Windows Vista Service Pack Service Pack 2 测试机:Windows 7专业版

在C#dll中将数据表转换为ADOD.Recordset的代码如下,

private Recordset ConvertToRecordset(DataTable inTable)
{
    ADODB.Recordset result = new ADODB.Recordset();
    result.CursorLocation = ADODB.CursorLocationEnum.adUseClient;

    ADODB.Fields resultFields = result.Fields;
    System.Data.DataColumnCollection inColumns = inTable.Columns;

    foreach (DataColumn inColumn in inColumns)
    {
        resultFields.Append(inColumn.ColumnName
              , TranslateType(inColumn.DataType)
              , inColumn.MaxLength
              , inColumn.AllowDBNull ? ADODB.FieldAttributeEnum.adFldIsNullable :
                                         ADODB.FieldAttributeEnum.adFldUnspecified
              , null);
    }

    result.Open(System.Reflection.Missing.Value
              , System.Reflection.Missing.Value
              , ADODB.CursorTypeEnum.adOpenStatic
              , ADODB.LockTypeEnum.adLockOptimistic, 0);

    foreach (DataRow dr in inTable.Rows)
    {
        result.AddNew(System.Reflection.Missing.Value,
                      System.Reflection.Missing.Value);

        for (int columnIndex = 0; columnIndex < inColumns.Count; columnIndex++)
        {
            resultFields[columnIndex].Value = dr[columnIndex];
        }
    }

    return result;
}

private DataTypeEnum TranslateType(Type columnType)
{
    switch (columnType.UnderlyingSystemType.ToString())
    {
        case "System.Boolean":
            return ADODB.DataTypeEnum.adBoolean;

        case "System.Byte":
            return ADODB.DataTypeEnum.adUnsignedTinyInt;

        case "System.Char":
            return ADODB.DataTypeEnum.adChar;

        case "System.DateTime":
            return ADODB.DataTypeEnum.adDate;

        case "System.Decimal":
            return ADODB.DataTypeEnum.adCurrency;

        case "System.Double":
            return ADODB.DataTypeEnum.adDouble;

        case "System.Int16":
            return ADODB.DataTypeEnum.adSmallInt;

        case "System.Int32":
            return ADODB.DataTypeEnum.adInteger;

        case "System.Int64":
            return ADODB.DataTypeEnum.adBigInt;

        case "System.SByte":
            return ADODB.DataTypeEnum.adTinyInt;

        case "System.Single":
            return ADODB.DataTypeEnum.adSingle;

        case "System.UInt16":
            return ADODB.DataTypeEnum.adUnsignedSmallInt;

        case "System.UInt32":
            return ADODB.DataTypeEnum.adUnsignedInt;

        case "System.UInt64":
            return ADODB.DataTypeEnum.adUnsignedBigInt;

        case "System.String":
        default:
            return ADODB.DataTypeEnum.adVarChar;
    }
}

我将DataTable传递给上面提到的方法,并返回结果:

ADODB.Recordset instanceRS = ConvertToRecordset(instancesDT);
return instanceRS;

再一次:在我的开发机器上返回的数据集很好并且所有记录都已填充,但在测试机器上它始终为null。我已经阅读过用于Windows 7的Microsoft ActiveX Data Objects 2.1库必须对其执行某些操作,但我无法找到更具体的内容。这是正确的吗?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

这是一个ActiveX控件吗?如果是,你确定你的安装程序正在注册activex dll吗?

您需要在本地计算机上注册activex dll。

(例如google search显示this