一个问题.创建CreateSQLQuery类型属于副本型,所以你会看到两个表,而且是不同的.请注意这段帮助:
Table的双重身份
窗口中的Table具备双重身份,使用不同身份时,类型不同,名称也不同。
作为控件
当作为窗口中的控件时,其类型为WinForm.Table,名称就是设计窗口时赋予的名称。
示例
Dim
t As WinForm.Table = e.Form.Controls("Table1")
t.SetBounds(0,0,400,300)
作为Table
当作为普通的Table使用的时候,其类型自然是Table。
至于名称则要区分两种情况。
如果类型为Normal,且非副本,此时窗口并不会创建新的Table,只是将原来的Table移到窗口中显示,所以其名称自然就等于绑定的Table名称。
例如将订单表移到主窗口后,对其的调用还是和原来一样:
Tables("订单").AllowEdit = True
如果类型为Normal,且为副本,或者类型为SQLTable、SQLQuery,此时窗口会创建一个新的Table,此新Table的名称为:
窗口名称_控件名称
假定这个Table的名称为Table1,且在窗口1中,那么代码中必须使用“窗口1_Table1”的名称来调用此Table:
Tables
("窗口1_Table1").AllowEdit = False
另外,fill的类型你最看看,如果你是表类型调整的话,请注意这一段帮助:
Fill方法
Table有一个Fill方法,可以根据指定的SQL语句,从指定的数据源中加载数据。
语法:
Fill(SelectString, IsQuery)
或者
Fill(SelectString, ConnectionName, IsQuery)
SelectString: Select语句
ConnectionName:可选参数,指定数据源名称
IsQuery: 逻辑型,设为True,将生成SQLQuery型Table,否则生成SQLTable型Table。
SQLTable是数据表,默认是可以编辑和保存的。
SQLQuery是查询表,默认不能编辑,通过将其AllowEdit属性设置为True,可以编辑查询结果,但不能保存编辑结果。
例如:
Tables
("窗口1_Table1").Fill("Select * From {客户}","nwnd",True)
不管Table原来是什么类型,显示的是什么数据,执行上述代码后,Table将成为SQLQuery类型,显示nwnd数据源中的客户表数据。
需要特别注意的是,如果只想取部分列生成SQLTable,那么必须包括主键列在内,例如:
Tables
("窗口1_Table1").Fill("Select [_Identify],[客户],[数量],[单价] From {订单}",False)
这里假定订单表是内部数据表,内部数据表的主键列是_Identify,如果是外部表,请使用实际的主键列名称。
如果要生成SQLQuery,则没有这个限制:
Tables(
"窗口1_Table1").Fill("Select [客户],[数量],[单价] From {订单}",True)
一定要注意,如果要生成SQLTable,第二个参数要设置为False,如果要生成SQLQuery,第二个参数则要设置为True,切不可搞混。
判断Table的类型
如果需要判断Table的类型,以及是否是副本,请参考:
TableType
IsCopy