Office中国论坛/Access中国论坛

标题: 【原创】vba中拼接SQL语句不再烦恼 [打印本页]

作者: 盗梦    时间: 2015-8-13 10:00
标题: 【原创】vba中拼接SQL语句不再烦恼
本帖最后由 盗梦 于 2015-8-13 10:20 编辑

      我们用vba编程操作数据库的时候,经常拼接SQL语句。稍微一不留神就容易弄错。
      例如简单带条件的Select语句,需要这么写
  1. Dim  strSql  as  string
  2. strSql = "select * from 表名 where 文本字段 = '" & 值1 & "' and 数字字段 = " & 值2
复制代码
     再例如,典型的 Insert into 新增记录语句,需要这么写
  1. Dim  strSql  as  string
  2. strSql = "Insert into 表名 (字段1,字段2,字段3)  values  ('" & 值1 & "'," & 值2 & ",'" & 值3 & "')"
复制代码
     要特别留意哪些需要加单引号,再添加一个字段也不方便。
     而且哪个值和哪个字段对应也不容易分别清楚,很容易就会眼花缭乱。

      对vba字符串拼接和SQL语句不太熟的,很容易出错。而且这样书写也不好维护。

      吐槽一大堆现状之后,说说我的方法吧。
      我的方法灵感是来自 C#的String.Format()方法。

      C#的String.Format()方法可以设置文本格式,预先腾出位置给各个参数填写。
      例如 String.Format("你好,我是{0}。我今年{1}岁","张三",12)
      会得到 "你好,我是张三。我今年12岁"。利用这个方法,再结合vba的特性,我写了一个函数
  1. '函数:按顺序设置参数,拼接字符串
  2. '作者:阿航
  3. '日期:2015/08/07
  4. '参考:GetStringByPara("我是{0},今年{1}岁","张三",12)
  5. '返回:字符串,"我是张三,我今年12岁"
  6. Public Function GetStringByPara(strFormat As String, ParamArray VarExpr() As Variant)
  7.     Dim i As Long
  8.     For i = 0 To UBound(VarExpr)
  9.         strFormat = Replace(strFormat, "{" & i & "}", VarExpr(i))
  10.     Next

  11.     GetStringByPara = strFormat
  12. End Function
复制代码

      我们就可以用我写的这个函数拼接字符串,包括SQL语句。例如
      [attach]57059[/attach]
      怎样 ^_^ ,用这个函数是不是方便清晰很多。

      特别说明:
      1、在该函数中 ParamArray VarExpr() As Variant  是可变多个参数的意思。
      就像Switch函数可以带多个不定个数的参数。
      该函数就是利用这个特性可以弹性设置多个参数。
      
      2、第一个参数是格式文本参数。
      其中需要替换的内容,一定要从0开始编号,用花括号加数字作为标记,中间编号不可断层 {0},{1},{2}.....
      但可以重复使用替换标记,例如 GetStringByPara("{0}:{1}{1}","id",5) 返回结果为 "id:55"

      最后,附上文件,函数在模块modString 中[attach]57060[/attach]
作者: 63889657    时间: 2015-8-13 13:26
{:soso_e179:}{:soso_e179:} 非常好,赶快下来试下
作者: 盗梦    时间: 2015-8-13 13:38
制定一个格式规则,结合vb\vba代码的特性,所以这个函数比较精简
作者: 风中漫步    时间: 2015-8-13 14:42
谢谢分享.
好像和todaynew斑竹的那个异曲同工{:soso_e120:}
他的灵感好像是来自vb.net的,呵呵,思路扩展的都很好,给赞
作者: 盗梦    时间: 2015-8-13 14:50
风中漫步 发表于 2015-8-13 14:42
谢谢分享.
好像和todaynew斑竹的那个异曲同工
他的灵感好像是来自vb.net的,呵呵,思路扩展的 ...

他也写过呀?!可否有链接看看
作者: 风中漫步    时间: 2015-8-13 15:09
盗梦 发表于 2015-8-13 14:50
他也写过呀?!可否有链接看看

好,我抽空帮你找找,你也搜一下.也就几个月之前发的吧,因我一般只看框架,所以不小心给你们联系上了
作者: 盗梦    时间: 2015-8-13 15:16
风中漫步 发表于 2015-8-13 15:09
好,我抽空帮你找找,你也搜一下.也就几个月之前发的吧,因我一般只看框架,所以不小心给你们联系上了

找着了
http://www.office-cn.net/thread-119792-1-1.html
基本上是一样的

作者: 好运牛    时间: 2015-8-13 23:35
好东西,一定要收藏
作者: 轻风    时间: 2015-8-14 16:42
盗梦 发表于 2015-8-13 15:16
找着了
http://www.office-cn.net/thread-119792-1-1.html
基本上是一样的

你们想到一块去了
作者: 盗梦    时间: 2015-8-14 16:43
轻风 发表于 2015-8-14 16:42
你们想到一块去了


作者: todaynew    时间: 2015-8-15 15:24
风中漫步 发表于 2015-8-13 14:42
谢谢分享.
好像和todaynew斑竹的那个异曲同工
他的灵感好像是来自vb.net的,呵呵,思路扩展的 ...

vb.net和C#.net所用的String类是一个,所以方法属性都一样。
作者: todaynew    时间: 2015-8-15 15:25
英雄所见略同
作者: 盗梦    时间: 2015-8-15 15:31
todaynew 发表于 2015-8-15 15:25
英雄所见略同


作者: zhao__feng    时间: 2015-8-15 19:46

好东西收藏,谢谢分享
作者: ak47ok    时间: 2015-11-28 13:00
每次回帖、谢谢!辛苦了。




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