失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > vba ado的一些封装

vba ado的一些封装

时间:2023-05-18 17:29:13

相关推荐

vba ado的一些封装

ado封装

DataBaseDataBaseUtil

DataBase

Option ExplicitPrivate dataBase As StringPrivate username As StringPrivate password As StringPrivate conn As ConnectionPrivate sql As StringPrivate serverip As StringPrivate rs As RecordsetPublic Property Let letServerip(ip As String)serverip = ipEnd PropertyPublic Property Let letDataBase(strDataBase As String)dataBase = strDataBaseEnd PropertyPublic Property Let letSql(s As String)sql = sDebug.Print sqlEnd PropertyPublic Property Let letUsername(u As String)username = uEnd PropertyPublic Property Let letPassword(p As String)password = pEnd PropertyPublic Property Get getConnection()Set getConnection = connEnd Property'获取Excel数据库Public Sub getExcelConnection()Set conn = CreateObject("adodb.connection")With conn.Provider = "Microsoft.ace.OLEDB.12.0".ConnectionString = "Data Source=" & dataBase & ";Extended Properties=Excel 12.0".OpenEnd WithEnd Sub'获取Mysql数据库Public Sub getMysqlConnection()Set conn = CreateObject("adodb.connection")With conn.ConnectionString = "DRIVER=MySQL ODBC 5.3 Unicode Driver;SERVER=" & serverip & ";Database=" & dataBase & ";Uid=" & username & ";Pwd=" & password.OpenEnd WithEnd Sub'获取SqlServver数据库Public Sub getSqlServerConnection()Set conn = CreateObject("adodb.connection")With conn.ConnectionString = "Provider=SQLOLEDB;Initial Catalog=" & dataBase & ";User ID=" & username & ";Password=" & password & ";Data Source=" & serverip'Debug.Print "Provider=SQLOLEDB;Initial Catalog=" & dataBase & ";User ID=" & user & ";Password=" & password & ";Data Source=" & serverip.OpenEnd WithEnd Sub'获取Access数据库Public Sub getAccessConnection()Set conn = CreateObject("adodb.connection")With conn.Provider = "Microsoft.ace.OLEDB.12.0".ConnectionString = "Data Source=" & dataBase.OpenEnd WithEnd Sub

DataBaseUtil

Option Explicit'操作数据库Private record As RecordsetPrivate dataBase As New dataBasePrivate sql As StringPrivate conn As ConnectionPrivate Const sqlServerUsername = "sa"Public Property Let letDataBase(db As dataBase)Set dataBase = dbEnd PropertyPublic Property Let letSql(s)sql = sEnd PropertyPublic Property Get getRecordSet()If checkRecordNotIsColse() ThenSet getRecordSet = recordEnd IfEnd Property'初始化方法Private Sub init()loadConnectionloadRecordSetdestroyDataBaseEnd Sub'CursorType游标类型:'Const adOpenForwardOnly = 0'前向游标,为缺省游标,提供最快的运行性能。用它打开recordset,从对至尾顺序取得所有结果。它不支持向后滚动,只允许在结果间单向移动。''Const adOpenKeyset = 1'静态游标,反映第一次打开游标时表中数据的状态,游标无法查明底层表中的数据行是否更新过、删除过或添加了新的数据。不过与只能前移的洲标不同,静态游标可以在结果间前后滚动。''Const adOpenDynamic = 2'键盘驱动的游标,可以查询表中底层数据行的某些变化,但不是全部。它特别是可以准确反映数据是否更新过。但它不能查明其它用户是否曾删除过数据行(删除掉的数据行在recordset中会留下空洞)。键盘驱动的游标支持在结果间前后滚动。''Const adOpenStatic = 3'动态游标,是最丰富的游标类型。游标打开时可以查询其他用户对表的任何改动,而且支持滚动。'LockType加锁类型:'Const adLockReadOnly = 1'缺省的上锁类型,只读方式上锁允许多个用户同时读取同样的数据,但不能改变数据。''Const adLockPessimistic = 2'以悲观上锁方式打开数据对象。该方式假定在你编辑记录时会有其它用户访问数据。此时一旦你开始编辑记录,其它用户就不能访问该数据。''Const adLockOptimistic = 3'以乐观上锁方式打开数据对象。该方式假定在你编辑记录时不会有其它用户访问数据。在完成改变之前,其它用户不能访问该记录。''Const adLockBatchOptimistic = 4'执行多行批处理更新时使用这种类型'Options参数:'Options参数标明用来打开记录集的命令字符串的类型?告诉ADO被执行的字符串内容的有关信息有助于高效地执行该命令字符串?''adCMDTable?被执行的字符串包含一个表的名字?'adCMDText?被执行的字符串包含一个命令文本?'adCMDStoredProc?被执行的字符串包含一个存储过程名?'adCMDUnknown?不指定字符串的内容? (这是缺省值?)'Recordset.State''AdStateClosed 默认,指示对象是关闭的。'adStateOpen 指示对象是打开的?'AdStateConnecting 指示 Recordset 对象正在连接。'AdStateExecuting 指示 Recordset 对象正在执行命令。'AdStateFetching 指示 Recordset 对象的行正在被读取。''VB中的常数 , 可以参考一下:'adStateClosed = 0'adStateOpen = 1'adStateConnecting = 2'adStateFetching = 8'adStateExecuting = 4'Recordset.Find Criteria, [SkipRows], [SearchDirection], [Strat]'criteria:强制性Criteria 参数是定义搜索条件的字符串。该字符串必须包含一个字段(列)名称,一个比较运算符和一个搜索值。'SkipRows;可选的SkipRecords 参数是一个很长的值,它指定在开始搜索之前要跳过当前记录之外的多少条记录。默认值为零,这意味着搜索从当前记录开始。'SearchDirection可以是adSearchForward,表示向前搜索记录;或者adSearchBackward,表示向后搜索记录。'SearchDirectionEnum:'adSearchBackward-1 从指定的起点向后搜索到第一条记录'adSearchForward 1 从指定的起点搜索到最后一条记录'Start:可选的Start参数是一个变体,可以是书签,也可以是BookmarkEnum常量之一,它指示搜索的开始位置。默认值是从当前记录开始。。'BookmarkEnum:'adBookmarkCurrent 0 默认值,从当前记录开始搜索'adBookmarkFirst 1 从第一条记录开始搜索'adBookmarkLast 2 从最后一条记录开始搜索'如果打开相应的记录,当前指针将位于匹配的记录上,如果没有找到记录,那么将位于下面两个位置中的一个:'· 如果是向前搜索,则位于记录集末尾位置的后面,EOF被设置为True。'· 如果是向后搜索,则位于记录集开始位置的前面,BOF被设置为True。'使用书签保存位置'如果没有找到相应的记录,记录的重新定位可以由书签轻松解决,因为可以为当前位置制作书签,如果在查找记录过程中没有找到所需的记录,那么再移回到上次保存的位置。'dim varBookMark as Variant'varBookMark = rsChantList.Bookmark'rsChantList.MoveFirst'rsChantList.Find "ChantName = 'Oma' "'If (rsChantList.BOF = True) Or (rsChantList.EOF = True) Then' MsgBox "Record not found"' rsChantList.Bookmark = varBookMark'End If'/Charles_ke/article/details/88714724'加载记录集Private Sub loadRecordSet()Set record = New Recordsetrecord.CursorLocation = adUseClientBatch 'adUseClientBatchrecord.Open sql, conn, CursorType:=adOpenDynamic, LockType:=adLockBatchOptimistic 'adLockBatchOptimisticEnd Sub'检验recordSet是否不为空Function checkRecordNotIsColse()checkRecordNotIsColse = record.State <> 0End Function'加载链接Private Sub loadConnection()Set conn = dataBase.getConnectionEnd Sub'销毁dataBasePrivate Sub destroyDataBase()Set dataBase = NothingEnd Sub'根据IP后3位和密码获取ConnectionPrivate Sub getSqlServerDataBase(ipLast, password)End Sub'获取Excel为数据库Private Sub getExcelDataBase(path)With dataBase.letDataBase = path.getExcelConnectionEnd WithEnd Sub'获取mdb文件Private Sub getAccessDataBase()With dataBase.letDataBase = accessPath.getAccessConnectionEnd WithEnd Sub'获取mysql的dataBasePrivate Sub getMysqlDataBase(ipLast, dabaBaseName As String)End Sub'执行Sql获取其中数据,并默认放置在[a1]Sub extractDataInR1C1()getFieldName [a1]executeDQLSql [a2]End Sub'链接sqlServer数据库,需要传入sql语句Sub getDataBaseUtilForSqlServer(strSql, ipLast, password)getSqlServerDataBase ipLast, passwordsql = strSqlinitEnd Sub'链接ExcelSub getDataBaseUtilForExcel(strSql, path)getExcelDataBase (path)sql = strSqlinitEnd Sub'链接AccessSub getDataBaseUtilForAccess(strSql)getAccessDataBasesql = strSqlinitEnd Sub'链接mysql数据库,需要传入sql语句 和ip后3位Sub getDataBaseUtilForMysql(strSql, ipLast, dabaBaseName As String)getMysqlDataBase ipLast, dabaBaseNamesql = strSqlinitEnd Sub'添加新的淘宝asinSub saveOrUpdateAsin(sku, asin, site)If checkAsinIsExistInRecordset(asin) ThenupdateAsin sku, asin, siteElseaddNewAsinupdateAsin sku, asin, siteEnd IfEnd Sub'向记录集中添加sku和asinSub addNewAsin()record.AddNewEnd SubSub updateAsin(sku, asin, site)With record.Fields("sku") = sku.Fields("asin") = asin.Fields("site") = siteEnd WithupdateRecordSetEnd Sub'检验recordSet中是否存在asinFunction checkAsinIsExistInRecordset(asinId)record.MoveFirstrecord.Find ("asin=" & asinId)If record.EOF ThencheckAsinIsExistInRecordset = TrueElsecheckAsinIsExistInRecordset = FalseEnd IfEnd Function'单条更新Sub updateRecordSet()record.updateEnd Sub'批量更新到数据库Sub updateRecordSetBatch()record.UpdateBatchEnd Sub'关闭链接Public Sub closeConnection()If checkRecordNotIsColse() Thenrecord.CloseSet record = NothingEnd Ifconn.CloseSet conn = NothingEnd Sub'抽取查询数据到指定单元格Public Sub executeDQLSql(range As range)range.CopyFromRecordset recordEnd Sub'执行DML语句Public Sub executeDMLSql()conn.Execute (sql)End Sub'获取字段名,并放置到指定单元格Public Sub getFieldName(rng As range)Dim fieldNum%Dim fieldsName$For fieldNum = 0 To record.Fields.count - 1fieldsName = fieldsName & record.Fields.item(fieldNum).name & ","Next'Debug.Print fieldsNamerng.Resize(, UBound(Split(fieldsName, ","))) = Application.Transpose(Application.Transpose(Split(fieldsName, ",")))End Sub'以sku为主键,更新结果Public Sub updataRecord(sku As Variant, name As String, param As Variant)With record.Find "ssku=" & sku.Fields(name) = .Fields(name).value & "," & param.MoveFirstEnd WithEnd Sub

如果觉得《vba ado的一些封装》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。