Office中国论坛/Access中国论坛

标题: 【Access小品】与猫版就变量问题商榷一二 [打印本页]

作者: todaynew    时间: 2011-7-22 11:52
标题: 【Access小品】与猫版就变量问题商榷一二
本帖最后由 todaynew 于 2011-7-22 12:02 编辑

  猫版前两日发了一帖《又谈变量的引用》,对VB中SQL语句的编写中变量的使用进行了一些归纳和总结。猫版所阐述的问题,对解决初学者处理该问题有很大帮助。但是,猫版在其阐述中还有一些没有完全说清楚的方面,因此觉得可以提出来进一步商榷,故将自己对该问题的理解提出,希望能通过这样的讨论,加深初学者对该问题的理解。

  不打算重复各种数据类型应该如何在SQL算式中表达的问题,对于这个问题可以参见猫版原文。重点想就为什么在构造SQL语句时有时需要考虑数据类型的表达方式有时又不需考虑表达方式的问题。为了使同志们明白问题本身,先引用猫版的两个例子:

dim TheName as string
TheName="张三"
Me.Form.RecordSource = "Select * From 表1 Where 姓名='" & TheName & "'"

dim TheFiledName as string
TheFiledName="建单日期"
Me.Form.RecordSource = "Select *,"& TheFiledName &" As A From 表1"

  在以上两个例子中,TheName和TheFiledName均为文本型变量,在例1中需要用单引号表示该变量为文本型变量,而在例2中则不需要这样处理。对于这样一个问题,猫版认为只有做为查询条件方应考虑加单引号。这个理解我以为不是很全面。比如我们可以写一个这样的例子:

dim TheFiledName as string
dim D as Date
TheFiledName="当前日期"
D=Date()
Me.Form.RecordSource = "Select *,#" & D & "# As " & TheFiledName & " From 表1"

  由这个例子来看,并非只是在做为查询条件时需要考虑对变量是否加单引号或者井号,在SQL语句的其他位置也需要考虑这个问题。那么什么是处理这个问题的原则以及道理何在呢?要说明白这个事情,需要有一段阐述过程,我想大体应该这样来说明:

  1、在VB中,SQL语句通常是一个字符串变量。因此SQL语句的构造过程便可以运用字符串处理的各种运算符和函数,最常用的就是字符串连接符&;

  2、由一系列变量通过字符串运算符和函数构造出来的SQL语句字符串,应符合SQL语句的书写规则。是否符合这个规则,可以用msgbox等调试手段进行观察;

  3、如果构造SQL语句的变量是SQL语句中某些字段、某些子句需要用到的变量值,而不是SQL语句的子句名称(诸如select、delect、from 、where等)和字段名称,则变量值需要按照不同的数据类型进行表达。

  按照这样一种理解,我们来看看如下的例子:

dim ssql as string
dim TheFiledName as string
dim D as Date
dim T as long
TheFiledName="当前日期"
D=Date()
T=10
ssql="Select Top " & T     'T是Top子句需要用到的变量值
ssql=ssql & " *,#" &  D & "# As " & TheFiledName   'D是【当前日期】字段变量需要用到的变量值,TheFiledName确定的是字段变量名称
ssql=ssql & " From 表1"
Me.Form.RecordSource = ssql
msgbox ssql  
'SQL语句以ssql字符串变量表示为:
'Select Top 10 *,#2011/7/22# as 当前日期 From 表1

  除了以上这些简单的例子外,还有更为复杂的情况,比如在SQL语句中用到域函数(DLookup、DSUM等),由于这些函数的参数为文本型变量,也需要用到文本变量处理的各种运算符,以及变量名称与变量值的不同处理方式,也就有可能出现更为让人迷惑的单引号和连接符问题。处理这样的问题最有效的办法就是按照上述说明,用msgbox分段来测试所编写的SQL语句字符串是否符合SQL语句的书写规则。



作者: 轻风    时间: 2011-7-22 12:20

作者: yanwei82123300    时间: 2011-7-22 13:14
有例子进行说明最好!!期待中1!!
作者: roych    时间: 2011-7-22 13:46
个人认为,构造SQL语句,在执行之前应当用Debug.Print在立即窗口中对所构造的语句进行一次显示,例如:
dim TheName as string
TheName="张三"
Debug.Print "Select * From 表1 Where 姓名='" & TheName & "'"
调试多了,自然就清楚单引号和双引号的问题了。
作者: ycxchen    时间: 2011-7-22 16:20
正需要,谢谢!
作者: wang1950317    时间: 2011-7-23 12:08
都是教授级的!学习!




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3