VB6中数据库参数化查询的技巧

    通常对数据库的查询和操作,大家习惯于拼接sql语句,在论坛上也经常有拼接sql语句方面的问题,让许多初学者深感头痛,即使是老手,遇到复杂的拼接也难免会出错。其实访问数据库我们有更好的选择,这就是参数化查询,这种方法高效安全,又可以省掉程序中拼接sql的麻烦。不过呢,这方面的介绍不是很多,有介绍通常的方法似乎比较烦琐,不能写成通用的方法函数,所以好象使用的人比较少。最近小小的研究了一下,有所发现,备忘在此,共大家参考:

    以下示例,基于xp sp3 + ADO2.8 + sql server 2000 (或者Access 2003)
    常见的方法:

    Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim cmd As ADODB.Command Dim param As ADODB.Parameter Dim Sql As String sql = "Select * From tb Where userName = ? And age = ? " Set cn = New ADODB.Connection cn.Open "......" '数据库连接语句 Set cmd = New ADODB.Command With cmd .ActiveConnection = cn .CommandType = adCmdText .CommandText = sql Set param = .CreateParameter("?", adVarchar, adParamInput, 20, txtName.Text) .Parameters.Append param Set param = .CreateParameter("?", adInteger, adParamInput, 4, txtAge.Text) .Parameters.Append param Set rs = .Execute End With '....... Set rs = Nothing Set cmd = Nothing Set cn = Nothing

    从上面的示例可见,要将参数化查询写成一个通用的方法或函数,的确有点困难。在尝试过程中,我偶然发现,其实cmd.Parameters这个集合,有些数据库存引擎提供了自动序列化的功能,并不要一项项的Append。而且效率远高于Append方法,以下是示例:

    Dim con As ADODB.Connection Dim cmd As ADODB.Command Dim Sql As String Dim arrValue Dim i As Long Sql = "INSERT INTO tb(descr,qty,dt) VALUES(?,?,?)" arrValue = Array("Test", 152, "2010-11-28") '参数值 Set con = New ADODB.Connection con.CursorLocation = adUseClient '客户端游标 con.Open "....." '连接数据库 Set cmd = New ADODB.Command With cmd .ActiveConnection = con .CommandText = Sql .CommandType = adCmdText For i = 0 To .Parameters.Count - 1 .Parameters(i) = arrValue(i) Next .Execute End With Set cmd = Nothing Set con = Nothing 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/vbman2003/archive/2010/12/06/6057503.aspx 

    这个方法同样也可以用于sql数据库的存储过程,只是要注意二点:一是存储过程的用户第一个参数的序号是1,序号0参数已经用于存储过程内部的事务;二是输出参数不用赋值。
    我这儿的活就是程序要同时访问不同平台的数据库,总想找出一个通用高效安全的方法,所以才有以上的发现,这样,虽然不是所有数据引擎都提供Parameters的序列化,但结合vb6提供的多态性,总算包装了一个适用目前要求的dll。
    好了,上面只是一点编程心得,还有许多要完善的地方,有兴趣的可以继续深入。

    (另外,示例代码是整理出来的思路,没有实测,可能有错误,只供参考...)

你可能感兴趣的:(VB6.0基础编程)