前段时间在做程序的时候出了这么一档子事:
某个按钮的处理函数:
Private Sub btn_check_data_invo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_check_data_invo.Click
Dim objconn As New Odbc.OdbcConnection 'odbc连接
Dim objDataAdapter As New Odbc.OdbcDataAdapter 'odbc适配器
Dim objtable As DataTable 'table
Dim cmdtable As Odbc.OdbcCommand = New Odbc.OdbcCommand 'odbc命令
If objconn.State = ConnectionState.Closed Then
objconn.ConnectionString = "DSN=aa;UID=;ASC=0;SR=1;GST=0;DB=hh;DBPR=TCP;DBH=hh;DBS=aa;OIDP=TCP;OIDS=SYMIXOIB;DBOS=UNIX;DBAM=Via Server;OIDH=hh"
objconn.Open() '打开连接
cmdtable.Connection = objconn
End If
If objds.Tables.IndexOf("db1") >= 0 Then
objds.Tables("db1").Reset() ' ---------------------------------------> 注意这一行
End If
cmdtable.CommandText = "select * from dataset1"
objDataAdapter.SelectCommand = cmdtable
objDataAdapter.Fill(objds, "db1")
objconn.Close()
datagrid1.datasource = objds.Tables("db1")
End Sub
结果在第一次点击按钮的时候没问题,第二次点击时datagrid就变成只有列(已经用设计器指定了style),
没有数据,期间也设了断点,发现表中是有数据的,但就是绑定不上。
同事让我用clear试试,换成objds.Tables("db1").Clear()以后果然就可以多次绑定。
上网查了查,只有说clear不行的,一般都是说reset没有问题。比如这篇帖子:
http://www.21cnvip.com/csdn/default.aspx?q=20040328/16/2895888.html
因为clear每次只是清除数据而不清除表结构,而reset才是将表至于初始状态,这样再次调用时可能会与原来的行冲突
还有说将表dispose,然后每次重建,并比较了三种方法,发现dispose要比clear和reset更快一点
最后选了类似于dispose的方法objds.Tables.Remove("db1"),然后重新fill
但还是不理解为何reset不行,到底reset时候微软都干了啥??