VB6对任意数据库的通用操作方法

只要称得上是一个系统的软件,决对是离不开数据库的。

数据库有很多种,尤其是不同的客户,可能需要用不同的数据库,

这就得需要我们在尽量少改动代码的情况下,

实现程序对不同数据库的操作。

 

对于数据库的操作,大家都知道无非是连接数据库,运行SQL语句,得到结果。

那么有没有一种通用的方法,使得我们不用或很少的修改代码来实现操作不同的数据库呢?

回答是有,但也需要遵循一些规则。

 

我们知道,不同的数据库,尤其是大型数据库,他们的主人在国际SQL标准上增加了自己的功能,

也就是除了标准的SQL语法外,他们自己创建了一些SQL语法。

那么,我们要想程序尽可能的不动或少动,那就要把语法控制在标准语法上。

因为标准的SQL语法,任何数据库都支持。

 

访问数据库,对于VB6来说,最好的就是ADO。

我们把对数据库的操作封装在一个cDataBase类中,他主要有以下接口,

一边说接口一边解释。

 

1、ConnectionString属性,MakeConnectionString方法。

一个是直接给出连接字符串,一个是动态生成连接字符串。

至于动态生成,我可以调用ADODB控件那个属性的对话框,来实现。

 

2、SQLCommand属性

这个是SQL命令的,直接给一个SQL命令字符串,至于格式,我们后面详细讲。

 

3、Parameters属性

这是一个数组参数,对应于SQL命令里的参数。(PS:最好是二维的)

 

综合上面的2和3二点,讲一下。

SQL命令的写法:

如果仅仅诸如select * from Table,这个没什么好讲的。

我们实际开发中,会用到许多动态的参数值,尤其是插入新记录的时候。

很多同行喜欢有拼接的方式,比如:

insert into student(id,name,password) values(1,'test','123456')

这种写法,在实际工作中,会产生一句相当难看懂的代码,

因为后面的值,全是一些变量或控件的值。

这里推荐这种写法:insert into student(id,name,password) values(?,?,?)

把这个字符串给我们的SQLCommand,

再定义一个二维数组,dim p(2) as string

p(0)="1"

p(1)="test"

p(2)="123456"

这里读者要说了,你这全是字符型啊,我ID是数字啊。

补充说明一下,数字,字符,日期,都可以定义成string。

这三种类型,是所有的数据库都支持的。

我上面PS了一下,说是定义二维的,那就是说,把参数的类型也加到数组里去,这样就比较完善了。

 

4、下面就是二个执行SQL语句的方法,为什么是二个呢?因为VB6不支持多态。

ExecuteSQLr方法,

此方法返回一个记录集,比如:select语法。

ExecuteSQLn方法,

此方法返回一个影响的行数,比如:insert语法,delete语法。

 

这二个方法,先要判断一下前面的属性有没有赋值。

接着,我们用ADO的Command对象来操作。

'返回受影响的记录数,Update/Delete/Insert
Public Function ExecuteSQLn() As Long
On Error GoTo errTrap
    Dim MyCon As New Connection    '连接对象
    Dim MyCMD As New Command   'cmd对象
    MyCon.ConnectionString = DataBaseConnectionString  '连接字符串
    MyCon.CursorLocation = adUseClient  '游标
    MyCon.Open   '打开连接
    MyCMD.ActiveConnection = MyCon  'CMD对象的当前连接
    MyCMD.CommandType = adCmdText  'CMD对象的命令类型
    MyCMD.CommandText = SQLString     'CMD对象的具体命令
    MyCMD.CommandTimeout = 15   'CMD对象的超时时间
    If Len(XMLParameters) = 0 Then  '判断是否有参数(我这里的参数不是数组,是XML字符串)
        '无参数
    Else
        Dim p() As String, i As Long
        If MyXML.XMLString2StringArray(XMLParameters, p) Then 'XML字符串转换为数组
            For i = LBound(p) To UBound(p)
                MyCMD.Parameters(i) = p(i)   '给SQL命令中的?赋值,
            Next
        End If
    End If
    Dim N As Long
    MyCMD.Execute N '执行
    ExecuteSQLn = N '返回影响的行数
errExit:
    Set MyCMD = Nothing '释放
    MyCon.Close  '关闭连接
    Set MyCon = Nothing '释放
    XMLParameters = ""  '清空参数
    SQLString = "" '清空命令
    Exit Function
errTrap:
    ExecuteSQLn = 0

    '写错误日志
    WriteLog "文件:cADO" & vbCrLf & _
             "过程:ExceuteSQLn()" & vbCrLf & _
             "错误号:" & Err.Number & vbCrLf & _
             "错误描述:" & Err.Description
    Err.Clear
    Resume errExit
End Function

 

这个是我实际使用的函数,起个抛砖引玉的作用。

 

 

使用文中所说的方法,对于一般的MIS的系统,足够应付了。

如果你说你的系统需要存储过程啊,触发器啊什么的,

我个人的观点是:

如果想程序通用任何数据库,

那么,

数据库只能作为一个数据载体,

不能依赖数据库本身过多的功能。

否则,

别说程序移植,光数据库里的存储过程,函数什么的,都会改死你。

相关推荐

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

vansoft

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值