后台数据的更新方式

用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事件代码设置为:

If e.DataCol.Name = "省市" Orelse e.DataCol.Name = "县市" Then
    Dim
dr As DataRow
   
Dim Filter As
String
    Filter = "[省市] = '" & e.DataRow("省市") & "' And [县市] = '" & e.DataRow("县市") & "'"
    dr = rdt.Find(
Filter)
    If
dr IsNot Nothing Then
        e.DataRow("区号") = dr("区号")
        e.DataRow("邮编") = dr("邮编")
    Else
        e.DataRow("区号") = Nothing
        e.DataRow("邮编") = Nothing
    End
If
End
If

你也可以用纯粹的SQL语言来实现类似的功能(参考用SQL语句实现自动输入),是用临时表的好处是数据只需加载一次, 坏处是需要加载所有数据,数据量特别大的时候可能不太合适。
如果你不想用SQL语句实现,数据量又比较大,可以考虑临时表只加载结构不加载数据,同时代码中的
GetComboListString改为SQLGetComboListStringFind改为SQLFind,具体参考:一个综合示例


本页地址:http://www.foxtable.com/webhelp/topics/2724.htm