VBA 操作数据库

 

连接Oracle数据库
Sub test()
' 连接 Oracle数据库
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.Open "Provider=MSDAORA.1;Data Source=数据源;User ID=用户名;Password=密码;Persist Security Info=True"
cn.Execute ("执行的数据库更新语句")
' 通过表或者查询创建数据集
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open "表名", cn, adOpenKeyset, adLockOptimistic
MsgBox rs.RecordCount
rs.Close
rs.Open "Select 字段 From 表名 Where 条件", cn, adOpenKeyset, adLockOptimistic
MsgBox rs.RecordCount

' 关闭数据集和数据连接
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Sub
ADODB方式连接SqlServer数据库

数据库连接方法:

Public Function conn_sqlServer(ByVal serverIP As String, _
                                     userid As String, _
                                     password As String, _
                                     database As String) As Connection
    Dim sConStr As String
    sConStr = "driver=sql server;" _
              & "server=" & serverIP _
              & ";Uid=" & userid _
              & ";Pwd=" & password _
              & ";Database=" & database
              
    Set conn = New ADODB.Connection
    conn.Open sConStr
    
    If conn Is Nothing Then
        MsgBox "データベースは失敗につながります."
        Exit Function
    Else
        Set conn_sqlServer = conn
    End If
End Function

其中,各参数代表的意义如下:

          serverIP :数据库服务器的IP地址、userid:数据库的用户名、password:数据库的用户密码、database:数据库

的实例名。

-------------------------------------------------------------

关闭数据库连接方法代码如下

Public Function closeConnection(ByVal conn As Connection)
    If conn Is Nothing Then
        MsgBox "データベースの接続は空です"
    Else
        conn.Close
    End If
End Function

其中,参数 conn :要关闭的连接。

--------------------------------------------------------------

执行查询语句的方法代码如下:

Public Function executeQuery(ByVal conn As Connection, querySql As String) As Recordset
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
    If conn Is Nothing Then
        MsgBox "データベースの接続は空です"
    Else
        rs.Open querySql, conn, 1, 3
    End If
    
    Set executeQuery = rs
End Function
其中,参数 conn :数据库连接、querySql :查询语句。返回值为查询结果集。

--------------------------------------------------------------

执行非查询语句的方法代码如下:

Public Function excuteUpdateDatabase(ByVal conn As Connection, updateSql As String) As Boolean
    
    Dim excuteResult As Boolean
    excuteResult = False
    
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
    conn.BeginTrans
    If conn Is Nothing Then
        MsgBox "データベースの接続は空です"
    Else
         Set rs = conn.Execute(updateSql)
    End If
    If rs Is Nothing Then
        msgbox  "いかなる行に影響していません" 
    Else
        excuteResult = True
        conn.CommitTrans
    End If
    
    excuteUpdateDatabase = excuteResult
End Function

其中,参数 conn :数据库连接、querySql :非查询语句。返回值:成功返回true,否侧返回false。

-----------------------------------------------------------------------

开启事务方法代码如下

Public Function begin_trans(ByVal conn As Connection)
    If conn Is Nothing Then
        MsgBox "データベースの接続は空です"
    Else
        conn.BeginTrans
    End If
End Function

其中,参数 conn:数据库连接。

-----------------------------------------------------------------------

提交事务的方法代码如下

Public Function commit_trans(ByVal conn As Connection)
    If conn Is Nothing Then
        MsgBox "データベースの接続は空です"
    Else
        conn.CommitTrans
    End If
End Function

其中,参数 conn:数据库连接。

-------------------------------------------------------------------------

回滚事务的方法代码如下

Public Function roolback_trans(ByVal conn As Connection)
    If conn Is Nothing Then
        MsgBox "データベースの接続は空です"
    Else
        conn.RollbackTrans
    End If
End Function

其中,参数 conn:数据库连接。

-----------------------------------------------------------------------

调用存储过程代码如下

Public Function callPr_restore(ByVal conn As Connection, pr_restore_name As String)
    Dim CNN_cmd As ADODB.Command
    Set CNN_cmd = New ADODB.Command
    Set CNN_cmd.ActiveConnection = conn               
    
    CNN_cmd.CommandText = pr_restore_name
    CNN_cmd.CommandType = adCmdStoredProc

'------------------------有参存储过程加以下代码----------------------------------

    With CNN_cmd

        ' 两种方式给参数赋值

        ' 第一种:CNN_cmd.P阿rameters(参数索引).value = 参数值

         ' 第二种:.CNN_cmd.Parameters.Append .CreateParameter(参数名,adVarChar, adParamInput, 10,

          参数值)

        .Parameters(1).Value = "20030611"
        .Parameters.Append .CreateParameter("stunum", adVarChar, adParamInput, 10, "20030610")
        .Parameters.Append .CreateParameter("sPrefix", adVarChar, adParamInput, 4, "2004")
        .Parameters.Append .CreateParameter("iLength", adInteger, adParamInput, , 5)
        .Parameters.Append .CreateParameter("sSequenceNumber", adVarChar, adParamOutput, 7,    

         sSequenceNumber)
    End With

'---------------------------------------END--------------------------------------------
    CNN_cmd.Execute 
End Function

其中,参数conn:数据库连接、pr_restore_name:存储过程名。

---------从数据库取数存放到excel表格------

Function Open_Conn(SqlDatabaseName, SqlPassword, SqlUsername)
   
  Dim Conn       As ADODB.Connection       '声明ADODB.Connection对象变量
  Dim Rdset      As ADODB.Recordset
  Dim TempC      As String
  Dim sSQL       As String
  Dim Rng        As String
  Dim I          As Integer

    sSQL = "select  Code,Area, KDtime, PDtime, DDtime, WCtime, Clerk, Status from work "
    
    '打开数据库连接
      Set Conn = New ADODB.Connection
      sConnStr = "Provider=sqloledb;server=ewaysun;Uid=sa;Pwd=;Database=helpdesk"
      Conn.Open sConnStr
      Rng = [a65535].End(xlUp).Row                                       '判断有记录的最后一行
      If Rng <> 1 Then                                                   '判断清空的起始行
             Range(Cells(2, 1), Cells(Rng, 8)).ClearContents                     '清空数据
             Cells(2, 1).CopyFromRecordset Conn.Execute(sSQL)            '查询后插入单元格
             Columns("C:E").Select
             Selection.NumberFormatLocal = "yyyy-mm-dd hh:mm"
             Columns("F:F").Select
             Selection.NumberFormatLocal = "[$-F400]hh:mm:ss AM/PM"
             Rng = [a65535].End(xlUp).Row
             Range(Cells(2, 1), Cells(Rng, 8)).Select
             '按人名排序
              Selection.Sort Key1:=Range("G2"), Order1:=xlAscending, Header:=xlGuess, _
                  OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
                    :=xlPinYin, DataOption1:=xlSortNormal
              Range(Cells(2, 1), Cells(Rng, 8)).Select
             '设置表格底纹
             Selection.Borders(xlDiagonalDown).LineStyle = xlNone
             Selection.Borders(xlDiagonalUp).LineStyle = xlNone
            With Selection.Borders(xlEdgeLeft)
                .LineStyle = xlContinuous
                .Weight = xlThin
                .ColorIndex = xlAutomatic
            End With
            With Selection.Borders(xlEdgeTop)
                .LineStyle = xlContinuous
                .Weight = xlThin
                .ColorIndex = xlAutomatic
            End With
            With Selection.Borders(xlEdgeBottom)
                .LineStyle = xlContinuous
                .Weight = xlThin
                .ColorIndex = xlAutomatic
            End With
            With Selection.Borders(xlEdgeRight)
                .LineStyle = xlContinuous
                .Weight = xlThin
                .ColorIndex = xlAutomatic
            End With
            With Selection.Borders(xlInsideVertical)
                .LineStyle = xlContinuous
                .Weight = xlThin
                .ColorIndex = xlAutomatic
            End With
            With Selection.Borders(xlInsideHorizontal)
                .LineStyle = xlContinuous
                .Weight = xlThin
                .ColorIndex = xlAutomatic
            End With
             
            '位置居中
          With Selection
              .HorizontalAlignment = xlCenter
              .VerticalAlignment = xlCenter
              .WrapText = False
              .Orientation = 0
              .AddIndent = False
              .IndentLevel = 0
              .ShrinkToFit = False
              .ReadingOrder = xlContext
              .MergeCells = False
          End With
      Else
             Cells(2, 1).CopyFromRecordset Conn.Execute(sSQL)            '查询后插入单元格
             Rng = [a65535].End(xlUp).Row                                       '判断有记录的最后一行
             Range(Cells(2, 1), Cells(Rng, 8)).Select
             '按人名排序
              Selection.Sort Key1:=Range("G2"), Order1:=xlAscending, Header:=xlGuess, _
                  OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
                    :=xlPinYin, DataOption1:=xlSortNormal
             
             Columns("C:E").Select
             Selection.NumberFormatLocal = "yyyy-mm-dd hh:mm"
             Columns("F:F").Select
             Selection.NumberFormatLocal = "[$-F400]hh:mm:ss AM/PM"

     End If
      Cells(2, 1).Select
      
      If Conn Is Nothing Then
         MsgBox "数据连接错误!"
      End If
End Function

-----------------通过querytable属性向excel中导入数据--------------------------------------------

向Excel中导入数据的函数
Public Function fillData(ByVal rs As ADODB.Recordset, _
                            sheetIndex As Integer, _
                            beginCell As String, _
                            EdgeLine As String, _
                            InsideLine As String)
                            
    With Sheets(sheetIndex).QueryTables.Add(rs, Sheets(sheetIndex).Range(beginCell))
        .FieldNames = False
        .Refresh
    End With
    
    Call setBorders(sheetIndex, beginCell, EdgeLine, InsideLine)
    
End Function

其中,rs为结果集、sheetIndex为sheet的索引、beginCell为开始添加数据的cell、EdgeLine为数据区域的外部边框线宽、InsideLine为数据区域的内部边框线宽。


设置数据区域边框的函数
Private Function setBorders(ByVal sheetIndex As Integer, _
                                  beginCell As String, _
                                  EdgeLine As String, _
                                  InsideLine As String)
                                  
    Sheets(sheetIndex).Range(beginCell).CurrentRegion.Select
    
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .Weight = EdgeLine
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .Weight = EdgeLine
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .Weight = EdgeLine
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .Weight = EdgeLine
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .Weight = InsideLine
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlInsideHorizontal)
        .LineStyle = xlContinuous
        .Weight = InsideLine
        .ColorIndex = xlAutomatic
    End With
    
End Function

其中,sheetIndex为sheet的索引、beginCell为开始添加数据的cell、EdgeLine为数据区域的外部边框线宽、InsideLine为数据区域的内部边框线宽。

QeryTable的属性列表如下:

With QueryTable.FieldNames = True
         
     .RowNumbers = False
        
      .FillAdjacentFormulas = False
        
     .PreserveFormatting = True
       
      .RefreshOnFileOpen = False
       
      .BackgroundQuery = True
        
     .RefreshStyle = xlInsertDeleteCells
       
      .SavePassword = True
       
      .SaveData = True
        
     .AdjustColumnWidth = True
        
     .RefreshPeriod = 0
        
     .PreserveColumnInfo = True
    End With

 

1-1 利用DAO创建数据库和数据表 7 1-2 利用ADOX创建数据库和数据表: 8 1-3 利用SQL语句创建数据库和数据表 9 1-4 在已有的数据库中创建数据表(DAO) 10 1-5 在已有的数据库中创建数据表(ADOX) 12 1-6 在已有的数据库中创建数据表(SQL,Command对象) 13 1-7 在已有的数据库中创建数据表(SQLRecordset对象) 13 1-8 利用Access对象创建数据库和数据表 14 1-8-1 不引用Access对象库而使用Access的有关对象、属性和方法 16 1-9 利用Access对象在已有的数据库中创建数据表 17 1-10 利用工作表数据创建数据表(ADOX) 18 1-11 利用工作表数据创建数据表(ADO+SQL) 21 1-12 利用工作表数据创建数据表(DAO) 23 1-13 利用已有的数据表创建新数据表(ADO) 25 1-14 利用已有的数据表创建新数据表(DAO) 27 1-15 利用已有的数据表创建新数据表(Access)(前绑定方法引用Access对象库) 28 2-1 检查数据表是否存在(ADO) 28 •实例2-2 检查数据表是否存在(ADOX) 32 •实例2-3 检查数据表是否存在(DAO) 33 •实例2-4 检查数据表是否存在(Access) 33 •实例2-5 获取数据库中所有表的名称和类型(ADO) 34 •实例2-6 获取数据库中所有表的名称和类型(ADOX) 35 •实例2-8 获取数据库中所有数据表名称(ADO) 36 •实例2-9 获取数据库中所有数据表名称(ADOX) 37 •实例2-10 获取数据库中所有数据表名称(DAO) 37 •实例2-11 获取数据库中所有数据表名称(Access) 38 •实例2-12 检查某字段是否存在(ADO) 39 •实例2-13 检查某字段是否存在(ADOX) 40 •实例2-14 检查某字段是否存在(DAO) 41 •实例2-15 检查某字段是否存在(Access) 41 •实例2-16 获取数据库中某数据表的所有字段信息(ADO) 42 •实例2-17 获取数据库中某数据表的所有字段信息(ADOX) 44 •实例2-18 获取数据库中某数据表的所有字段信息(DAO) 45 •实例2-19 获取数据库中某数据表的所有字段信息(Access) 47 •实例2-20 获取数据库的所有查询信息(ADOX) 48 •实例2-21 获取数据库的所有查询信息(DAO) 49 •实例2-22 获取数据库的模式信息(openschema) 50 •实例2-23 获取表的创建日期和最后更新日期(ADOX) 51 •实例2-24 获取表的创建日期和最后更新日期(DAO) 52 •实例3-1 将数据库记录数据全部导入到excel工作表(ADO,之一) 53 •实例3-2 将数据库记录数据全部导入到excel工作表(ADO,之二) 54 •实例3-3 将数据库记录数据全部导入到Excel工作表(ADO,之三) 55 •实例3-4 将数据库记录数据全部导入到Excel工作表(DAO,之一) 56 •实例3-5 将数据库记录数据全部导入到Excel工作表(DAO,之二) 57 •实例3-6 将数据库记录数据全部导入到Excel工作表(QueryTable集合) 58 •实例3-7 将数据库的某些字段的记录数据导入到Excel工作表(ADO) 59 •实例3-8 将数据库的某些字段记录数据导入到Excel工作表(DAO) 60 •实例3-9 查询前面的若干条记录(全部字段)(TOP) 61 •实例3-10 查询前面的若干条记录(部分字段)(TOP) 62 •实例3-11 查询不重复的字段记录(DISTINCT) 63 •实例3-12 利用Like运算符进行模糊查询 64 •实例3-13 查询某一区间内的记录(BETWEEN) 65 •实例3-14 查询存在于某个集合里面的记录(IN) 67 •实例3-15 将查询结果进行排序(ORDER BY) 68 •实例3-16 进行复杂条件的查询(WHERE) 69 •实例3-17 利用合计函数进行查询(查询最大值和最小值) 70 •实例3-18 利用合计函数进行查询(查询合计值和平均值) 71 •实例3-19 将一个查询结果作为查询条件进行查询 72 •实例3-20 将查询结果进行分组(GROUP BY) 73 •实例3-21 查询结果进行分组(HAVING) 74 •实例3-22 通过计算列进行查询 76 •实例3-23 使用IS NULL运算符进行查询 77 •实例3-24 使用COUNT函数进行查询 78 •实例3-25 使用FIRST函数与LAST函数查询第一条记录和最后一条记录的字段 78 •实例3-26 使用Parameters参数动态查询记录(DAO)指定单个参数 79 •实例3-27 使用parameters参数动态查询记录(DAO):指定多个参数 80 •实例3-28 使用parameters参数动态查询记录(ADO):指定单个参数 81 •实例3-29 使用Parameters参数动态查询记录(ADO):指定多个参数 83 •实例3-30 使用别名查询数据库 84 •实例3-31 将查询结果作为窗体控件的源数据 85 •实例3-32 通过窗体控件查询浏览数据库记录 88 •实例3-33 多表查询(WHERE连接) 98 •实例3-34 多表查询(内连接INNER JOINT) 99 •实例3-35 多表查询(左外连接LEFT OUTER JOINT) 101 •实例3-36 多表查询(右外连接 RIGHT OUTER JOINT) 102 •实例3-37 多表查询(子查询WHERE,ANY,SOME) 103 •实例3-38 多表查询(子查询EXISTS,NOT EXISTS) 105 •实例3-39 从两个数据表中查询出都存在的记录 106 •实例3-40 从两个数据表中查询出只存在于某个数据表的记录 108 •实例3-41 将查询结果生成一个数据表 108 •实例3-42 将查询结果保存为一个XML文件 109 •实例3-43 利用工作表实现记录的分页显示 110 •实例3-44 利用窗体实现记录的分页显示 113 •实例4-1 添加新记录(ADO+addnew) 116 •实例4-2 添加新记录(ADO+SQL) 117 •实例4-3 添加新记录(DAO+addnew) 118 •实例4-4 添加新记录(DAO+SQL) 118 •实例4-5 添加新记录(Access+SQL) 119 •实例4-6 修改更新特定记录(ADO+SQL) 120 •实例4-7 修改更新特定记录(DAO+SQL) 120 •实例4-8 修改更新特定记录(Access+SQL) 121 •实例4-9 修改更新全部记录(ADO+SQL) 121 •实例4-10 修改更新全部记录(DAO+SQL) 122 •实例4-11 修改更新全部记录(Access+SQL) 122 •实例4-12 删除特定记录(ADO+SQL) 123 •实例4-13 删除特定记录(DAO+SQL) 124 •实例4-14 删除特定记录(Acess+SQL) 124 •实例4-15 删除全部记录(ADO+SQL) 124 •实例4-16 删除全部记录(DAO+SQL) 125 •实例4-17 删除全部记录(Access+SQL) 125 •实例4-18 通过窗体编辑记录 126 •实例5-1 将整个工作表数据都保存为新的Access数据库(Access) 128 •实例5-2 将工作表的某些区域数据保存为新Access数据库(Access) 129 •实例5-3 将工作簿的所有工作表数据分别保存为不同的数据表(Access) 130 •实例5-4 将多个工作簿的某个工作表数据汇总为新Access数据库(Access) 131 •实例5-5将多个工作簿的某个工作表数据保存为不同的数据表(Access) 132 •实例5-6 将工作表数据保存到已有的Access数据库(循环方式)(ADO) 134 •实例5-7 将工作表数据保存到已有的Access数据库(循环方式)(DAO) 136 •实例5-8 将工作表数据保存到已有的Access数据库(数组方式)(ADO) 138 •实例5-9 将工作表数据保存到已有的Access数据库(数组方式)(DAO) 139 •实例5-10 将工作簿的所有工作表数据分别保存为不同的数据表(ADO) 141 •实例5-11 将工作簿的所有工作表数据分别保存为不同的数据表(DAO) 142 •实例6-1 打开数据库和数据表(Getobject函数) 144 •实例6-2 打开数据库和数据表(createobject函数) 145 •实例6-3 删除数据表(ADO) 145 •实例6-4 删除数据表(ADOX) 146 •实例6-5 删除数据表(DAO+DELETE) 147 •实例6-6 删除数据表(DAO+SQL) 147 •实例6-7 删除数据表(Access) 148 •实例6-8 为数据表增加字段(ADO) 148 •实例6-9 为数据表增加字段(ADOX) 149 •实例6-10 为数据表增加字段(DAO) 150 •实例6-11 为数据表增加字段(Access) 151 •实例6-12 删除字段(ADO) 152 •实例6-13 删除字段(ADOX) 153 •实例6-14 删除字段(DAO) 154 •实例6-15 删除字段(Access) 155 •实例6-16 改变字段的类型(ADO) 157 •实例6-17 改变字段的类型(DAO) 157 •实例6-18 改变字段的类型(Access) 158 •实例6-19 改变字段的长度(ADO) 158 •实例6-20 改变字段的长度(DAO) 159 •实例6-21 改变字段的长度(Access) 159 •实例6-22 重命名数据表(Access) 159 •实例6-23 复制数据表(Access) 160 •实例6-24 复制数据表(ADO) 161 •实例6-25 复制数据表(DAO) 162 •实例6-26 通过窗体维护数据库 162 •实例7-1 判断SQL Server数据库是否存在(ADO) 172 •实例7-2 检查数据表是否存在(ADOX) 173 •实例7-3 创建新的SQL Server数据库和数据表(ADO) 174 •实例7-4 在已有的SQL Servre数据库中创建数据表(ADO) 175 •实例7-5 从SQL Server数据库服务器中删除数据库ADO) 176 •实例7-6 从SQL Server数据库中删除数据表(ADO) 177 •实例7-7 将SQL Server数据库中的数据导入到Excel工作表(ADO) 177 •实例7-8 将SQL Server数据库中的数据导入到Excel工作表(DAO) 178 •实例7-9 查询获取SQL Server数据库的数据(ADO) 180 •实例7-10 查询获取SQL Server数据库的数据(DAO) 181 •实例7-11 将工作表数据导入到SQL Server数据库ADO) 182 •实例7-12 向SQL Server数据库中添加记录的一般方法 183 •实例7-13 将SQL Server数据库转换为Access数据库 184 •实例7-14 将access数据库转换为SQL Server数据库 185 •实例8-1 将FoxPro数据库全部数据导入到Excel工作表 187 •实例8-2 查询获取FoxPro数据库数据 188 •实例8-3 将excel工作表数据保存到FoxPro数据库 189 •实例8-4 判断FoxPro数据库的字段是否存在 190 •实例8-5 获取FoxPro数据库的字段信息 190 •实例9-1 从工作簿的某个工作表中查询获取数据(ADO) 192 •实例9-2 从工作簿的全部工作表中查询获取数据(ADO) 193 •实例9-3 利用DAO从工作表中查询数据 194 •实例9-4 查询其他工作簿的数据(ADO) 195 •实例9-6 利用ADO对工作表数据进行多重排序 196 •实例9-7 利用ADO按照字符的长度对数据进行排序 197 •实例9-8 比较两张表,将两个表中相同的行数据抓取出来 198 •实例9-9 比较两张表,将只存在于某个表中的行数据抓取出来 199 •实例9-10 删除工作表数据区域内的所有空行 200 •实例10-2 利用DAO导入文本文件的全部内容 202 •实例10-3 利用ADO导入文本文件的部分内容 203 •实例10-4 利用DAO导入文本文件的部分内容 204 •实例10-5 利用ADO获取文本文件的行数和列数 205 •实例10-6 利用ADO将超过65536行的文本文件数据导入到Excel工作表 206 •实例10-7 将工作表全部数据保存为文本文件(SaveAs) 208 •实例10-8 将工作表全部数据保存为文本文件(循环) 208 •实例10-9 将数据库数据导出为文本文件 209 •实例10-10 将文本文件保存为Access数据库(Access) 210 •实例10-11 将文本文件保存为Access数据库ADO+ADOX) 211
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值