.NET中,修改DateSet.xsd数据集中TableAdapter的超时设置的方法(转自:股海无涯)

来源:互联网 发布:淘宝密码怎么设置 编辑:程序博客网 时间:2024/04/30 14:51
不大喜欢写编程经验类文章,但这个问题在网上有很多错误答案,所以在这里写一写,以帮助一下遇到同样问题的同行.


在平时的开发中,我一直喜欢用XSD数据集来管理数据库,而不喜欢直接用SQL命令,因为用XSD可以节省大量时间,引用时也非常方便.


但是,最近在开发一个涉及海量数据的软件时,却遇到了SQL查询超时的问题,一查询,就提示超时错误.


由于XSD文件中默认的TableAdapter的CommandTimeOut设置为30,当数据量达到十万级时,这个30秒的设置就太短了.


尝试了修改TableAdapter.Connection.ConnectionTimeout的值(或直接在程序设置My.Setting中修改连接字符串),不起作用,后来一查,才知道,这个是尝试连接时的超时,与命令执行时的CommandTimeOut是两回事.


必须要修改TableAdapter.Adapter.SelectCommand.CommandTimeout 才行,但是,这个SelectCommand是在执行Fill方法时才即时生成的,在执行Fill前引用会提示为对象为 Nothing 而在Fill后再引用,都晚了.


怎么办呢?看来从外部是无法修改SelectCommand.CommandTimeout 的,必须进入到Fill方法的内部.于是,我又采取了以下对策:


即:尝试在XSD文件的自动生成代码DataSet.Designer.Vb中,在TableAdapter类 的 Fill方法下添加以下这行:


            Me.Adapter.SelectCommand.CommandTimeout = 300




测试后果然有效.可是,XSD文件的代码是自动生成的,一点击"运行自定义工具",代码就被刷新了,添加的代码被删除了.


这下又怎么办呢?想了很久,在网上查了,也没有任何解决方案,多数人都回复三个字:"不可能".有的甚至说,要享受XSD带来的方便,就要接受它的缺点.


可是,微软真的这么笨,竟然以为自动生成的代码会没有任何缺陷?不对.根据我多年的经验,每当遇到貌似无法解决的情况,与其去怀疑微软的智商,还不如先怀疑自己的悟性.


一定有什么方法.于是,我按照微软系的常规,尝试着双击了一下DateSet.XSD视图界面上的TableAdapter的名称.奇迹出现了------


界面突然切换到了DateSet.VB,是个代码文件,里面自动生成了一个类:


Namespace DataSetTableAdapters
    Partial Public Class TableAdapter
    End Class
End Namespace


奥秘一定在里面,虽然类里什么都没有,但是,它的名字空间和类不正是我引用TableAdapters时用到的吗?这是不是说,我已经进入到的DataSetTableAdapters.TableAdapters 这个类里边,我现在可以从内部来操作TableAdapters 的属性了?


于是,尝试添加了以下代码:


Namespace DataSetTableAdapters
    Partial Public Class TableAdapter
        ''' <summary>
        ''' 此方法将重设FILL和GETDATA方法中的SELECTCOMMAND命令的超时时间
        ''' </summary>
        ''' <param name="NewTimeOut"></param>
        ''' <remarks></remarks>
        Public Sub ResetCommandTimeOut(ByVal NewTimeOut As Integer)
            Me.CommandCollection(0).CommandTimeout = NewTimeOut
        End Sub
    End Class
End Namespace


这里,Me.CommandCollection是个命令集合,存储了SelectCommand,DeleteCommand等命令,其中,Me.CommandCollection(0)正好存储的是Fill和GetData方法的SelectCommand命令,因此,修改它,就OK了.


于是,在引用Fill方法前,执行一次    TableAdapter.ResetCommandTimeOut(300)                     


方法,再运行Fill方法,再也不出现超时提示了,用


       Debug.Print(Me.TableAdapter.Adapter.SelectCommand.CommandTimeout)


一试,果然值为300,.真是太爽了!


注意哦,这个方法,可以对XSD中的任何对象作任意的修改哦!现在还怀疑微软的智商么?
原创粉丝点击