前言:
因此,在过去5年左右的时间里,我公司已经编写了各种应用程序和工具.不幸的是,许多开发这些应用程序的人都使用了强类型数据集,我现在正考虑在我们的商店中取消它们……
使用强类型数据集的一个较大的进程现在超时…我打算在接下来的几个月内使用nHibernate重写整个进程但是目前我需要更改超时以允许我们的用户使用该进程虽然很慢……不幸的是,微软将commandtimeout方法设为私有,所以我无法直接访问它们.
到目前为止,我遇到的唯一解决方案是为每个TableAdapter创建一个部分类,并在那里包含超时方法……
这非常笨重,因为它意味着为很多TableAdapter添加部分类…
有谁知道一种更有效的方法来处理这个问题?
解决方法
我用反射“解决了”这个问题. (例如,VS2010模型允许公开Adapter属性,SelectCommand等在GetData之前将为null.)
void SetAllCommandTimeouts(object adapter,int timeout) { var commands = adapter.GetType().InvokeMember( "CommandCollection",BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.NonPublic,null,adapter,new object[0]); var sqlCommand = (sqlCommand[])commands; foreach (var cmd in sqlCommand) { cmd.CommandTimeout = timeout; } } // unfortunately this still requires work after a TableAdapter is obtained... var ta = new MyTableAdapter(); SetAllCommandTimeouts(ta,120); var t = ta.GetData();
由于缺少公共基础/接口,实际上不可能更好地键入适配器(尽管可能是组件).
快乐的编码.