我们有一个dataaccess图层,它有一个带有无类型数据集的函数的接口。当我们将类型化数据集从实体层传递到dataaccess层时,我们收到一个错误。请帮忙解决错误。
CODE:
public interface diNonTransactional
{
int ExecuteDataAdapterDataTableWithParams(IDbCommand podbCommand, ref DataTable pdtDataTable);
}
下面的函数正在解决我的问题,但我不知道如何在dataaccess层实现该函数。请帮助我如何实现。
新代码
int ExecuteDataAdapterDataTableWithParams<T>(IDbCommand podbCommand, ref T pdtDataTable) where T :` DataTable;
我的旧实现:
public int ExecuteDataAdapterDataTableWithParams(IDbCommand podbCommand, ref DataTable pdtDT)
{
IDataAdapter ldaDataAdapter = default(IDataAdapter);
IDbTransaction lodbTrans = default(IDbTransaction);
int liFetchedRows = 0;
lodbTrans = EstablishConnection();
try
{
podbCommand.Connection = coConnection;
podbCommand.Transaction = lodbTrans;
ldaDataAdapter = GetDataAdapter(ref podbCommand);
ldaDataAdapter.TableMappings.Add("Table", pdtDT.TableName);
liFetchedRows = ldaDataAdapter.Fill(pdtDT.DataSet);
}
catch (Exception ex)
{
throw (ex);
}
finally
{
CloseConnection(ref lodbTrans);
}
return liFetchedRows;
}
答案 0 :(得分:0)
这里的问题是参数被声明为'ref'。当参数声明为'ref'时,意味着新对象可以从方法中传回并分配给原始变量。如果您尝试传入类型化的DataTable,则原始变量就是该类型。因为参数简单地声明为DataTable类型,这意味着您可以传递一个无类型的DataTable,并且无法将其分配给类型化的DataTable变量,因此编译错误。如果参数必须声明为'ref',因为你想要从方法中传递一个对象,那么就不能传入一个类型化的DataTable。您必须使该方法通用并对该泛型类型参数设置约束,如下所示:
public interface diNonTransactional
{
int ExecuteDataAdapterDataTableWithParams<TDataTable>(IDbCommand podbCommand, ref TDataTable pdtDataTable)
where TDataTable : DataTable;
}
当然,您需要能够提供可以处理的实现。可能更好的选择是使接口通用,然后在声明实现它的类时可以修复TDataTable的类型。