我创建了一个用于 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 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;
再来一次:在我的开发机器上返回的数据集很好,并且所有记录都已填充,但在测试机器上它始终为空。我在某处读到 Microsoft ActiveX Data Objects 2.1 Library for Windows 7 必须对其进行处理,但我找不到更具体的内容。这是正确的吗?我怎样才能解决这个问题?