Option Explicit

'==================================== 声明属性 =================================
Private Con As ADODB.Connection

' ====================================声明事件===================================

'==================================== 初始化 类 ===================================
Private Sub Class_Initialize()
  Set Con = New ADODB.Connection
  Con.CursorLocation = adUseClient '设置此项才可获取 recordset.RecordCount
  Con.ConnectionString = "Driver={MySQL ODBC 5.2 ANSI Driver};" + _
    "Server=sc;" + _
    "DB=oa;" + _
    "UID=UID;" + _
    "PWD=PWD;" + _
    "OPTION=3;" + _
    "Stmt=Set Names 'UTF-8';"

End Sub

'=================================== 以“属性”的形式对 私有变量 读取、赋值 ====================================

'=================================== 公有方法 ====================================
'关闭连接
Public Sub closeConnection()
  Con.Close
  Set Con = Nothing
End Sub

'检测是否连接成功
Public Sub checkConnection()
  Con.Open
  If Con.State = adStateOpen Then
    MsgBox "链接状态:" & Con.State & vbCrLf & "ADO版本:" & Con.Version, vbInformation, ""
  End If

  closeConnection '关闭连接
End Sub

'将查询得到的记录显示到指定 单元格
Public Sub recordToCell(sqlStr As String, wBook, wSheet, firstCell As String)
  Dim thisRec As ADODB.Recordset

  '查询记录
  Set thisRec = selectRecord(sqlStr)

  '写入到指定 单元格
  Workbooks(wBook).Sheets(wSheet).Range(firstCell).CopyFromRecordset thisRec

  closeConnection '关闭连接
End Sub

'============= 数据库 “插、查、改、删” ==============
'“删除”用“更改”[标记删除]实现)

'①“插入”一条记录(返回值:1成功,-1已有相同值,0失败)
'db 数据库名
'fieldArray 字段名 数组
'valueArray 字段值 数组
'checkField 用于检查是否已有相同记录的 字段名(field1,field2,……)
Public Function inertRecord(db As String, fieldArray, valueArray, checkField As String) As Integer
  '检查是否已有相应记录
  Dim insertRow As Integer
  Dim rec As ADODB.Recordset
  Dim checkFV, fieldValue, insertSql As String

  ' MsgBox TypeName(fieldArray)

  checkFV = Join(fieldAndValue(fieldArray, valueArray, checkField), " AND ")
  fieldValue = Join(fieldAndValue(fieldArray, valueArray), ",")

  Set rec = selectRecord(db, "id", checkFV)
  If rec.RecordCount < 1 Then
    insertSql = "INSERT INTO `" & db & "` SET " & fieldValue
    Con.Execute insertSql, insertRow, adCmdText

    inertRecord = IIf(insertRow = 1, 1, 0)
  Else
    inertRecord = -1
  End If

  Set rec = Nothing
End Function

'②按条件“查询”记录(返回值:ADODB.Recordset对象)
'db 数据库名
'fields 要查询的字段名(field1,field2,……)
'where 查询条件(`field1`='value1' AND|OR `field2`='value2' AND|OR ……)
'sortFields 排序工序(field1,field2[DESC],……)
'limit 要查询的记录数(100 或 20,100)
Public Function selectRecord(db As String, Optional fields = "*", _
  Optional where = "", Optional sortFields = "", Optional limit = "") As ADODB.Recordset

  Dim sqlStr As String

  sqlStr = "SELECT " & fields & " FROM `" & db & "`"
  If where <> "" Then sqlStr = sqlStr & " WHERE " & where
  If sortFields <> "" Then sqlStr = sqlStr & " ORDER BY '" & sortFields & "'"
  If limit <> "" Then sqlStr = sqlStr & " LIMIT " & limit

  ' MsgBox sqlStr
  Set selectRecord = allSql(sqlStr) '总查询 (执行sql语句方法)
End Function

'③“更改”符合指定条件的记录的指定字段(返回受影响的行数)
'db 数据库名
'fieldArray 字段名 数组
'valueArray 字段值 数组
'where 条件(`field1`='value1' AND|OR `field2`='value2' AND|OR ……)
Public Function updateRecord(db As String, fieldArray, valueArray, where As String) As Integer
  Dim updateRows As Integer
  Dim updateSql, fieldValue As String

  fieldValue = Join(fieldAndValue(fieldArray, valueArray), ",")

  If fieldValue <> "" Then
    updateSql = "UPDATE `" & db & "` SET " & fieldValue & " WHERE " & where
    Con.Open
    Con.Execute updateSql, updateRows, adCmdText

    updateRecord = IIf(updateRows <> 0, updateRows, 0)
  End If
End Function

'总查询 (执行sql语句方法)
Public Function allSql(sqlStr) As ADODB.Recordset
  Dim iRowscount As Long

  Con.Open
  Set allSql = Con.Execute(sqlStr, iRowscount, adCmdText)
End Function

'=================================== 私有方法 ====================================
'将 fieldArray、valueArray 连接成 `field`='value'(Array)并返回 “数组”
'(若 onlyField 不为空,则只连接包含其内元素的 field)
Private Function fieldAndValue(fieldArray, valueArray, Optional onlyField = "")
  Dim i, s As Integer
  Dim fj_onlyField(), fvArray()

  ' MsgBox fieldArray(0)
  For i = 0 To UBound(fieldArray)
    If fieldArray(i) <> "" Then
      If onlyField = "" Then
        ReDim Preserve fvArray(i)
        fvArray(i) = "`" & fieldArray(i) & "`='" & valueArray(i) & "'"
      Else
        If InStr(onlyField, ",") > 0 Then
          fj_onlyField = Split(onlyField, ",")
          If checkArrayValue(fj_onlyField, fieldArray(i)) = True Then
            ReDim Preserve fvArray(s)
            fvArray(s) = "`" & fieldArray(i) & "`='" & valueArray(i) & "'"
            s = s + 1
          End If
        Else
          If onlyField = fieldArray(i) Then
            ReDim Preserve fvArray(0)
            fvArray(0) = "`" & fieldArray(i) & "`='" & valueArray(i) & "'"
            Exit For
          End If
        End If
      End If
    End If
  Next i
  fieldAndValue = fvArray
 End Function

'检测数组中是否包含有=指定值的元素
Private Function checkArrayValue(arr, theValue) As Boolean
  Dim i As Integer

  checkArrayValue = False
  For i = 0 To UBound(arr)
    If arr(i) = theValue Then
      checkArrayValue = True
      Exit For
    End If
  Next i
End Function

'将 html实体 转换成正常字符(可用)
Private Function htmlDecodes(str As String) As String
  If str = "" Then
    htmlDecodes = ""
  Else
    str = Replace(str, "&lt;", "<")
    str = Replace(str, "&gt;", ">")
    str = Replace(str, "&amp;", "&")
    str = Replace(str, "&quot;", Chr(34))
    str = Replace(str, "&gt;", Chr(39))

    htmlDecodes = str
  End If
End Function

VBA Mysql 类的更多相关文章

  1. 完善ecshop的mysql类

    前篇文章中,我提及到了如何<提取ecshop的mysql类>.但是没有数据库前缀的写法 废话不说,上步骤(目录结构请参考提取ecshop的mysql类) 修改connfig.php为 &l ...

  2. 提取ecshop的mysql类

    在下一篇文章中,我还将介绍如何完善ecshop的mysql类,使用ecshop的数据库前缀 下载ecshop后,解压缩,进入目录upload/includes,复制里面的cls_mysql.php放进 ...

  3. php四个常用类封装 :MySQL类、 分页类、缩略图类、上传类;;分页例子;

    Mysql类 <?php /** * Mysql类 */ class Mysql{ private static $link = null;//数据库连接 /** * 私有的构造方法 */ pr ...

  4. 简单的php Mysql类(查询 删除 更新)

    php Mysql类一般都包括了几乎我们常用的数据库操作方法,这里只提供了查询 删除 更新三种操作,算不是很全只是一个简单的数据库查询类了.      代码如下 复制代码 class mysql { ...

  5. 简单的一个MySQL类的实现:

    '''定义MySQL类:1.对象有id.host.port三个属性2.定义工具create_id,在实例化时为每个对象随机生成id,保证id唯一3.提供两种实例化方式,方式一:用户传入host和por ...

  6. C#---数据库访问通用类、Access数据库操作类、mysql类 .[转]

    原文链接 //C# 数据库访问通用类 (ADO.NET)using System;using System.Collections.Generic;using System.Text;using Sy ...

  7. C#---数据库访问通用类、Access数据库操作类、mysql类 .

    //C# 数据库访问通用类 (ADO.NET)using System;using System.Collections.Generic;using System.Text;using System. ...

  8. 封装mysql类

    类: <?phpheader("content-type:text/html;charset=utf-8");//封装一个类/*掌握满足单例模式的必要条件(1)私有的构造方法 ...

  9. PHP Mysql类【转】

    前几天没事在网上转发现了一个类,记录下来: <?php Class DB { private $link_id; private $handle; private $is_log; privat ...

随机推荐

  1. bjfu1164 Parity Game

    简单规律题.首先想到的是,若01串中1有n个,则可以通过操作,使串中1的个数变为n-1.n-2……1.0个:第2个想到的是,如果n为奇数,可以通过操作,使串中1的个数最多变为n+1,而若n为偶数,则无 ...

  2. QC开发只能修改指派给自己的缺陷,而其他的bug可以查看但是不允许修改

    今天在QC9.0项目中增加了几个项目,然后我的想法是:开发只能修改指派给自己的缺陷,而其他的bug可以查看但是不允许修改 虽说qc我还是比较熟悉的,但是对于这个问题,感觉可能要用到脚本,对于脚本我一窍 ...

  3. PHP的MySQL扩展:PHP访问MySQL的常用扩展函数

    来源:http://www.ido321.com/1024.html 一.PHP连接数据库及基本操作 MySQL采用的是’客户机/服务器’架构.使用PHP安装的MySQL扩展函数,和直接使用客户端软件 ...

  4. Google Chart API 参考 中文版

    Google Chart API 参考 中文版 文档信息 翻译: Cloudream ,最后修改:02/22/2008 06:11:08 英文版版权归 Google , 转载此中文版必须以链接形式注明 ...

  5. 【暑假】[实用数据结构]UVa11991 Easy Problem from Rujia Liu?

    UVa11991 Easy Problem from Rujia Liu?  思路:  构造数组data,使满足data[v][k]为第k个v的下标.因为不是每一个整数都会出现因此用到map,又因为每 ...

  6. codeforces 704B - Ant Man 贪心

    codeforces 704B - Ant Man 贪心 题意:n个点,每个点有5个值,每次从一个点跳到另一个点,向左跳:abs(b.x-a.x)+a.ll+b.rr 向右跳:abs(b.x-a.x) ...

  7. Tasks Queues and Cron Jobs(任务队列和时钟守护作业)

    一个网络应用必须迅速响应网络请求,一般要小于1s,最好是几十微秒,以便为坐在浏览器前面的用户提供一个流畅的体验.这就给不了应用太多的时间来处理工作.有时会是有更多的工作要做而不是有时间来做它.< ...

  8. 1分钟内检查Linux服务器性能的10条命令

    如果你的Linux服务器突然负载暴增,告警短信快发爆你的手机,如何在最短时间内找出Linux性能问题所在?Netflix性能工程团队的Brendan Gregg写下了这篇博文,来看他们是怎样通过十条命 ...

  9. Linux定时执行任务命令概述:at和crontab

    本文介绍在Linux下的两种定时执行任务的方法:at命令,以及crontab服务. (1)at命令 假如我们只是想要让特定任务运行一次,那么,这时候就要用到at监控程序了. 设置at命令很简单,指示定 ...

  10. 去掉 CONSOLE 窗口(转)

    建立一个win32 console application的话,linker的/subsystem选项应该为CONSOLE,可以在VC开发环境的project->setting->link ...