VBA Mysql 类
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, "<", "<")
str = Replace(str, ">", ">")
str = Replace(str, "&", "&")
str = Replace(str, """, Chr(34))
str = Replace(str, ">", Chr(39))
htmlDecodes = str
End If
End Function
VBA Mysql 类的更多相关文章
- 完善ecshop的mysql类
前篇文章中,我提及到了如何<提取ecshop的mysql类>.但是没有数据库前缀的写法 废话不说,上步骤(目录结构请参考提取ecshop的mysql类) 修改connfig.php为 &l ...
- 提取ecshop的mysql类
在下一篇文章中,我还将介绍如何完善ecshop的mysql类,使用ecshop的数据库前缀 下载ecshop后,解压缩,进入目录upload/includes,复制里面的cls_mysql.php放进 ...
- php四个常用类封装 :MySQL类、 分页类、缩略图类、上传类;;分页例子;
Mysql类 <?php /** * Mysql类 */ class Mysql{ private static $link = null;//数据库连接 /** * 私有的构造方法 */ pr ...
- 简单的php Mysql类(查询 删除 更新)
php Mysql类一般都包括了几乎我们常用的数据库操作方法,这里只提供了查询 删除 更新三种操作,算不是很全只是一个简单的数据库查询类了. 代码如下 复制代码 class mysql { ...
- 简单的一个MySQL类的实现:
'''定义MySQL类:1.对象有id.host.port三个属性2.定义工具create_id,在实例化时为每个对象随机生成id,保证id唯一3.提供两种实例化方式,方式一:用户传入host和por ...
- C#---数据库访问通用类、Access数据库操作类、mysql类 .[转]
原文链接 //C# 数据库访问通用类 (ADO.NET)using System;using System.Collections.Generic;using System.Text;using Sy ...
- C#---数据库访问通用类、Access数据库操作类、mysql类 .
//C# 数据库访问通用类 (ADO.NET)using System;using System.Collections.Generic;using System.Text;using System. ...
- 封装mysql类
类: <?phpheader("content-type:text/html;charset=utf-8");//封装一个类/*掌握满足单例模式的必要条件(1)私有的构造方法 ...
- PHP Mysql类【转】
前几天没事在网上转发现了一个类,记录下来: <?php Class DB { private $link_id; private $handle; private $is_log; privat ...
随机推荐
- delegate 为什么用 weak属性
weak指针主要用于“父-子”关系,父亲拥有一个儿子的strong指针,因此是儿子的所有者:但是为了阻止所有权回环,儿子需要使用weak指针指向父亲:你的viewcontroller通过strong指 ...
- 仿酷狗音乐播放器开发日志二十三 修复Option控件显示状态不全的bug(附源码)
转载请说明原出处,谢谢~~ 整个仿酷狗工程的开发将近尾声,现在还差选项设置窗体的部分,显然在设置窗体里用的最多的就是OptionUI控件,我在写好大致的布局后去测试效果,发现Option控件的显示效果 ...
- asp.net C# 时间格式大全
asp.net C# 时间格式大全DateTime dt = DateTime.Now;// Label1.Text = dt.ToString();//2005-11-5 13:21:25// ...
- MorningSale 介绍
MorningSale是一个WEB端的收集门店销售数据,显示销售数据的简单系统,我相信该系统能够有效的提高销售公司在门店销售数据收集 汇总 分析方面的工作效率. 主要功能介绍如下: 1.查看某个店面 ...
- 【跟我一起学Python吧】python with statement 进阶理解
由于之前有一个项目老是要打开文件,然后用pickle.load(file),再处理...最后要关闭文件,所以觉得有点繁琐,代码也不简洁.所以向python with statement寻求解决方法.以 ...
- Tkinter教程之Event篇(2)
本文转载自:http://blog.csdn.net/jcodeer/article/details/1823548 '''Tkinter教程之Event篇(2)''''''5.测试离开(Leave) ...
- linux进程调度函数浅析(基于3.16-rc4)
众所周知,进程调度使用schedule()函数来完成,下面我们从分析该函数开始,代码如下(kernel/sched/core.c): asmlinkage __visible void __sched ...
- cocosbuilder学习汇总
目前与cocos2d-x-2.14版本对应的cocosbuilder版本为cocosbuilder-3,目前为alpha-5.稳定版本为cocosbuilder2.1,但与cocos2d-x不匹配(C ...
- Spring For Android初体验
Spring For Android是Spring框架的一个扩展,其主要目的在乎简化Android本地应用的开发,这其中包括了你可以使用该项目提供的 RestTemplate来为你的Android客户 ...
- BAT-使用BAT方法清理系统垃圾
@echo offecho 正在清理......del /f /s /q %systemdrive%\*.tmpdel /f /s /q %systemdrive%\*._mpdel /f /s /q ...