第四节 使用 SQL pass-through
与使用视图相比的另一个选择是单独地使用 SQL pass-through。这就意味着你发送 SQL 语句到后端并明白地告诉它要做什么。如果你想添加一条记录可发送一个 Insert。要保存记录可发送一个 Update。显然这比使用视图要做更多的工作。但是它允许你完全地控制发生什么和什么时候将会发生。
载入表单
表单 MEMBEXEC.SCX 是一个与上面的表单相似的表单,它只是使用 SQL pass-through 而不是视图。以下是表单的 Load 方法代码。
Open Database library
ThisForm.nHandle = SQLConnect('cnLibrary')
If ThisForm.nHandle < 0
ThisForm.ShowError
ThisForm.lConnected = .F.
Else
lcSQL = "Select member.member_no, lastname, firstname, " + ;
" middleinitial, street, city, state, zip, " + ;
" phone_no, expr_date, birth_date = null, " + ;
" adult_member_no = null " + ;
"From member, adult " + ;
"Where member.member_no = -99 "
If SQLExec(ThisForm.nHandle, lcSQL, "c_member") < 0
ThisForm.ShowError
ThisForm.lConnected = .F.
Endif
= CursorSetProp("Buffering", DB_BUFOPTRECORD, 'c_member')
Endif
在表单载入时,SQLConnect() 用于使用保存在 Visual FoxPro Library 数据库中的 cnLibrary 连接来建立到 SQL Server 的连接。如果 SQLConnect() 失败,除了退出和回家外,你没有别的事可做。
如果连接正常,以发送到 SQL Server 一个搜索成员号 -99 的 Select 语句来创建了一个空的游标。即使没有返回记录,Visual FoxPro 也会创建该游标。然后设置该游标的开放式缓存。这样做的原因是可以在该表单上使用缓存了的游标。这反映了一些视图的易用性。
定位一个成员
当在表单上使用视图时,定位一个成员只需简单地为视图参数赋值并重新获取值(requery)。当使用 SQL pass-through 时要稍稍复杂一些。要获取成员信息,要创建一条 Select 语句并发送到服务器。在下面的代码中你可以看到这是一个 Union Select。如果成员存在于 Member 表和 Adult 或 Juvenile 表中。
lcSQL = "Select member.member_no, lastname, firstname, " + ;
" middleinitial, street, city, state, zip, " + ;
" phone_no, expr_date, birth_date = null, " + ;
" adult_member_no = null " + ;
"From member, adult " + ;
"Where member.member_no = adult.member_no " + ;
" And member.member_no = " + ;
" AllTrim(ThisForm.txtMemberID.Value) + " " + ;
"Union " + ;
"Select member.member_no, lastname, firstname, " + ;
" middleinitial, street, city, state, zip, " + ;
" phone_no, expr_date, birth_date, " + ;