在Excel在用ADO读写数据库

    技术2025-10-21  10

    Function GetConnStr () As String     Dim strCn As String     Dim server As String     Dim database As String     Dim user As String     Dim pwd As String         Dim obj As Object     Set obj = Sheets("Ctrl")     server = obj.Range("DBServer").Text     database = obj.Range("Database").Text     user = obj.Range("User").Text     pwd = obj.Range("Password").Text         strCn = "driver=DRIVER={MySql ODBC 5.1 Driver};" _         & "server=" & server _         & ";Uid=" & user _         & ";Pwd=" & pwd _         & ";Database=" & database             GetConnStr = strCn     '"Provider=MSDAORA.1;Data Source=ORCL;User ID=scott;Password=tiger;Persist Security Info=True" End Function Function InitFirstRow (sheet As Object) ' set font, interior, first row's style     Dim obj As Object     Set obj = sheet.Cells.Font         obj.Name = "Calibri"     obj.Size = 12         Set obj = sheet.Rows("1:1")     obj.RowHeight = 37     obj.Font.Bold = True     obj.AutoFilter     obj.WrapText = True         obj.Interior.ColorIndex = 37     obj.Interior.Pattern = xlSolid         sheet.Activate     With ActiveWindow         .SplitColumn = 2         .SplitRow = 1     End With     ActiveWindow.FreezePanes = True     End Function Function GetDataRowCount (sheet As Object) As Integer     Dim obj As Object     Set obj = sheet.Cells     Dim i As Integer     i = 0     Do         If obj.Range("A1").Offset(i).Text = "" Then Exit Do         i = i + 1     Loop     GetDataRowCount = i End Function Sub CreateResourceTab ()     Dim conn As New ADODB.Connection          ' 定义数据链接对象 ,保存连接数据库信息;请先添加ADO引用     Dim strCn As String, strSql As String         strSql = "create table Resource(ID  int,EnglishName varchar(40),StartDate varchar(20),AssignedSOW varchar(100),TL  varchar(40),Status  varchar(200));"         strCn = GetConnStr()     conn.Open strCn         If conn Is Nothing Then         MsgBox "连接失败" & conn.Errors(0).Description         Return     End If         conn.Execute strSql     conn.Close     End Sub Sub ReadData ()     Dim i As Integer, j As Integer, sht As Worksheet 'i,j为整数变量;sht 为excel工作表对象变量,指向某一工作表     Dim cn As New ADODB.Connection '定义数据链接对象 ,保存连接数据库信息;请先添加ADO引用     Dim rs As New ADODB.Recordset '定义记录集对象,保存数据表     Dim strCn As String, strSql As String '字符串变量             strCn = GetConnStr()         '下面的语句将读取数据表数据,并将它保存到excel工作表中:画两张表想像一下,工作表为一张两维表,记录集也是一张两维表     strSql = "select * from Resource"    '定义SQL查询命令字符串     cn.Open strCn                       '与数据库建立连接,如果成功,返回连接对象cn     rs.Open strSql, cn                  '执行strSQL所含的SQL命令,结果保存在rs记录集对象中             Set sht = ThisWorkbook.Worksheets("DesTab")   '把sht指向当前工作簿的sheet1工作表     ' delete all data     sht.Cells.Delete Shift:=xlUp     sht.Cells(1, 1) = "No."     sht.Cells(1, 2) = "English Name"     sht.Cells(1, 3) = "Start Date"     sht.Cells(1, 4) = "Assigned SOW"     sht.Cells(1, 5) = "TL"     sht.Cells(1, 6) = "Status"         i = 2         Do While Not rs.EOF     '当数据指针未移到记录集末尾时,循环下列操作         sht.Cells(i, 1) = rs("ID")    '把当前记录的字段1的值保存到sheet1工作表的第i行第1列         sht.Cells(i, 2) = rs("EnglishName")    '把当前字段2的值保存到sheet1工作表的第i行第2列         sht.Cells(i, 3) = rs("StartDate")         sht.Cells(i, 4) = rs("AssignedSOW")         sht.Cells(i, 5) = rs("TL")         sht.Cells(i, 6) = rs("Status")             rs.MoveNext                      '把指针移向下一条记录         i = i + 1                        'i加1,准备把下一记录相关字段的值保存到工作表的下一行     Loop                                 '循环         rs.Close   '关闭记录集,至此,程序将把某数据表的字段1和字段2保存在excel工作表sheet1的第1、2列,行数等于数据表的记录数     InitFirstRow sht         Columns("A:A").EntireColumn.AutoFit     Columns("B:B").EntireColumn.AutoFit     Columns("C:C").EntireColumn.AutoFit     Columns("D:D").EntireColumn.AutoFit     Columns("E:E").EntireColumn.AutoFit     Columns("F:F").EntireColumn.AutoFit         sht.Activate     ThisWorkbook.Save         MsgBox "Read " & (i - 2) & " records"     End Sub Sub SaveData ()     Dim i As Integer, j As Integer          ' i,j为整数变量;     Dim sht As Worksheet                    ' sht 为excel工作表对象变量,指向某一工作表     Dim cn As New ADODB.Connection          ' 定义数据链接对象 ,保存连接数据库信息;请先添加ADO引用     Dim strCn As String, strSql As String   ' 字符串变量     strCn = GetConnStr()     Set sht = ThisWorkbook.Worksheets("SrcTab")   '把sht指向当前工作簿的sheet1工作表     sht.ClearArrows         cn.Open strCn                       '与数据库建立连接,如果成功,返回连接对象cn         j = GetDataRowCount(sht)         For i = 2 To j    '循环开始, 构造SQL命令         strSql = "insert into Resource(ID, EnglishName, StartDate, AssignedSOW, TL, Status) " _             & "values( " _             & sht.Cells(i, 1) _             & ",'" & sht.Cells(i, 2) _             & "','" & sht.Cells(i, 3) _             & "','" & sht.Cells(i, 4) _             & "','" & sht.Cells(i, 5) _             & "','" & sht.Cells(i, 6) & "');"         ' 执行SQL         cn.Execute strSql              Next     cn.Close '关闭数据库链接,释放资源     MsgBox "Insert " & (j - 1) & " records" End Sub Sub DeleteData ()     Dim cn As New ADODB.Connection          ' 定义数据链接对象 ,保存连接数据库信息;请先添加ADO引用     Dim strCn As String, strSql As String   ' 字符串变量         strSql = "delete from Resource"    '定义SQL查询命令字符串     strCn = GetConnStr()     cn.Open strCn                       '与数据库建立连接,如果成功,返回连接对象cn         cn.Execute strSql     cn.Close     End Sub 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         Dim conn As New ADODB.Connection     conn.Open sConStr         If conn Is Nothing Then         MsgBox "连接已关闭"         Exit Function     Else         MsgBox "连接成功"         Conn_SqlServer = conn     End If End Function Public Function closeConnection (ByVal conn As Connection) If conn Is Nothing Then     MsgBox "连接已关闭" Else     conn.Close     MsgBox "连接关闭成功" End If End Function Sub TestConn()     Dim conn As New ADODB.Connection     conn = Conn_SqlServer("Y012593/sqlexpress", "sa", "!sa2010", "happy")     Call closeConnection(conn)     End Sub Sub TestOracleConnect ()     Dim cn As ADODB.Connection     Dim rs As New ADODB.Recordset '定义记录集对象,保存数据表     Dim strSql As String         strSql = "select sysdate from dual"         Set cn = New ADODB.Connection         cn.Open "Provider=MSDAORA.1;Data Source=ORCL;User ID=scott;Password=tiger;Persist Security Info=True"     If cn Is Nothing Then         MsgBox "连接已关闭"         Return     End If         rs.Open strSql, cn                  '执行strSQL所含的SQL命令,结果保存在rs记录集对象中         strSql = rs("sysdate")    '把当前记录的字段1的值保存到sheet1工作表的第i行第1列     MsgBox "连接成功,当前时间为: " & strSql         rs.Close   '关闭记录集,至此,程序将把某数据表的字段1和字段2保存在excel工作表sheet1的第1、2列,行数等于数据表的记录数         cn.Close     End Sub

    最新回复(0)