0

MS Accessで使用するC#dllを作成しました。すべてが私の開発マシンでうまく機能します。C#dllには、returntypeが。のメソッドがありますADODB.Recordset。返されたレコードセットをMSAccessフォームにバインドしましたが、開発マシンでうまく機能します。

問題は、インストーラーを使用してdllを別のマシンにインストールし、MSAccessアプリケーションを実行する場合です。エラーはありませんが、常にnullレコードセットを返します。MS Accessで参照を確認しましたが、カスタムdllとMicrosoft ActiveXデータオブジェクト2.1ライブラリを参照しており、C#メソッドの呼び出しにエラーはありません。配列と文字列を返す他のメソッドは正常に機能していますがADODB.Recordset、戻り型としてのメソッドのみがこの問題を抱えています。

私の開発マシン:Windows Vista Service Pack Service Pack 2テストマシン:Windows 7 Professional Edition

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;

もう一度:開発マシンに返されるデータセットは正常で、すべてのレコードが入力されますが、テストマシンでは常にnullです。Windows7用のMicrosoftActiveXData Objects 2.1ライブラリが何かをしなければならないことをどこかで読んだことがありますが、これ以上具体的なものは見つかりません。これは正しいですか?どうすればこれを修正できますか?

4

1 に答える 1

2

これはActiveXコントロールですか?もしそうなら、あなたのインストールプログラムがActiveXdllを登録していると確信していますか?

ローカルマシンにActiveXdllを登録する必要があります。

(たとえば、グーグル検索はこれを示しています)

于 2013-01-02T18:38:22.293 に答える