后台数据的更新方式
用Update语句更新
如果要更新没有加载的后台据,多数时候,我们用Update语句,例如:
Dim cmd As New
SQLCommand
cmd.CommandText = "UPDATE
{订单} SET 折扣 = 0.2 WHERE 数量 > 500"
cmd.ExecuteNonQuery()
表示将订购数量超过500的订单的折扣设置为0.2。
用自带的方法更新
如果某个表已经加载结构,但是没有加载数据,或者只加载了部分数据,可以用DataTable自带的方法查询或更新后台数据。
DataTable和后台数据处理相关的方法有:
SQLCompute | 计算后台所有数据 |
SQLReplaceFor | 批量更新后台数 |
SQLDeleteFor | 批量删除后台数据 |
SQLSelect | 从后台查询数据 |
SQLUpdate | 保存通过SQLSelect查询得到的数据 |
SQLFind | 从后台查找数据 |
SQLGetValues | 从后台的指定列中提取不重复值,以集合的形式返回 |
SQLGetComboListString | 从后台的指定的列中提取不重复的值,用符号"|"将这些值连接成一个字符串,并返回这个字符串 |
例如:
DataTables("订单").SQLReplaceFor("折扣", 0.02, "数量 > 500")
表示将订购数量超过500的订单的折扣设置为0.2,不管这些订单是否已经加载,都会更新。
用临时表更新
我们也可以直接用临时表来更新后台数据,例如:
Dim
dt
As
DataTable
Dim
cmd
As
New
SQLCommand
cmd.CommandText =
"Select [_Identify],折扣 From {订单}
Where 数量 > 500"
'注意要包括主键列
dt = cmd.ExecuteReader(True)
'注意可选参数设置为True
For Each
dr
As
DataRow
In dt.DataRows
dr("折扣")
= 0.2
Next
dt.Save()
同样可以将订购数量超过500的订单的折扣设置为0.2,这个方法的好处是临时表中的数据已经是更新后的了,无需重新加载。
使用临时表更新数据的要点:
1、Select语句必须将主键列包括进来,例如上面的例子,虽然我们只需更新折扣列,但是必须将[Identify]列包括在Select语句中,否则临时表的任何更新都无法保存。
2、Select语句尽量尽量只包括主键和要更新的列,不要包含用不到的列,以减少数据加载量,特别是开发基于网络的管理系统的时候,更要注意。
3、必须将ExecuteReader的可选参数设置为True。
上述代码都使用内部数据表作为示例,如果使用外部数据源,记得设置数据源名称
临时表与全局变量
在实际开发的过程中,我们可以需要经常在代码中调用某个表的数据,但是又不需要在界面中显示这个表。
对于这种情况,我们可以使用临时表加载这个表的数据,同时将临时表保存在一个Public变量中,这样就可以在任何位置调用这个表,无需反复加载。
假定我们建立了一个外部数据源"Region",其中有个名为“行政区域”的基础数据表,这个表已经输入了全国所有县级行政区域的资料,包括省市、市县、区号、邮编四列。
我们不希望主界面中显示这个表,但是希望能随时通过代码调用这个表的数据。
当然我们可以正常加载这个表,然后将这个表的Visible属性设置为False即可,不过这次我们用临时表来解决:
1、首先在全局代码中定义一个Public变量:
Public rdt As DataTable
2、在项目事件AfterOpenProject中设置代码:
Dim
cmd
As
New
SQLCommand
cmd.ConnectionName
=
"region"
cmd.CommandText
=
"Select * From {行政区域}"
rdt =
cmd.ExecuteReader()
3、现在我们可以在任何地方调用这个表的数据,例如窗口中有两个ComboBox控件,第一个ComboBox列出所有的省市,第二个ComboBox根据第一个ComboBox所选择的省市,列出该省市所有的县市。
首先将窗口的AfterLoad事件代码设置为:
e.Form.Controls("ComboBox1").ComboList = rdt.GetComboListString("省市")
然后将ComboBox2的Enter事件代码设置为:
Dim
sh As
String = e.Form.Controls("ComboBox1").value
e.sender.ComboList
= rdt.GetComboListString("县市","省市
= '" & sh
& "'")
4、再例如希望在客户表中输入省市、县市两列后,区号和邮编能自动输入,可以将客户表的DataColChanged事件代码设置为:
你也可以用纯粹的SQL语言来实现类似的功能(参考用SQL语句实现自动输入),是用临时表的好处是数据只需加载一次,
坏处是需要加载所有数据,数据量特别大的时候可能不太合适。
如果你不想用SQL语句实现,数据量又比较大,可以考虑临时表只加载结构不加载数据,同时代码中的GetComboListString改为SQLGetComboListString,Find改为SQLFind,具体参考:一个综合示例