【问题标题】:ADODB.Recordset is returned as null from C# dllADODB.Recordset 从 C# dll 返回为 null
【发布时间】:2012-12-17 02:54:43
【问题描述】:

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

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

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

C#dll中将datatable转为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;

再一次:我的开发机器上返回的数据集很好,所有记录都已填充,但在测试机器上它始终为空。我在某处读到 Microsoft ActiveX Data Objects 2.1 Library for Windows 7 必须对其进行处理,但我找不到更具体的内容。这是正确的吗?我该如何解决这个问题?

【问题讨论】:

  • 如果您不发布现有的代码,很难判断您的数据集返回什么......
  • 谢谢。我已经更新了问题。
  • 仅供参考-没有升c之类的东西。语言名称是 C#。

标签: c# ms-access-2007 adodb


【解决方案1】:

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

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

(例如google search 显示this

【讨论】:

  • 是的,它是 Microsoft ActiveX 数据对象 2.1 库。我在正在转换的项目中添加了参考 ADOD。我也将它添加到名为adod.dll 的安装程序包中。
  • @AdnanYaseen - 这还不够,请参阅提供的链接。
  • 感谢您提供的链接。如果 ActiveX 已经在 MS Access 参考列表中的可用参考中列出,那么我还需要单独注册它吗?
  • 是的,多亏了你,它成功了。你为我打开了一扇门让我去寻找。添加到您的解决方案中,对于使用 Visual Studio 安装程序的任何人,注册 ActiveX 组件的步骤如下: 1. 在 Visual Studio 2008 中创建一个安装项目。 2. 将 ActiveX 控件 DLL 文件添加到此安装项目中。 3. 在解决方案资源管理器中选择 ActiveX DLL 文件并切换到属性窗口。 4. 为 Register 属性选择 vsdrfCOM。参考:social.msdn.microsoft.com/Forums/en-AU/winformssetup/thread/…
  • @AdnanYaseen - 请记住,本地安全策略可能仍会阻止注册。 (特别是如果你没有对你的 DLL 进行强签名。)
猜你喜欢
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 2014-05-28
  • 2011-02-06
  • 2019-05-28
  • 1970-01-01
  • 2017-09-18
  • 2010-09-24
相关资源
最近更新 更多