Use Excel 2010 to read/write to a SQL Server 2008 database using stored procedures

前端 未结 3 1166
无人共我
无人共我 2021-02-04 21:14

We have a SQL Server 2008 database that has stored procedures to handle reads/writes/etc. These procedures are used by a variety of applications internally.

The need ha

3条回答
  •  悲哀的现实
    2021-02-04 21:38

    I ended up going with this approach using AD authentication. I used the example in this post for inspiration: http://www.eggheadcafe.com/community/sql-server/13/10141669/using-excel-to-update-data-on-ms-sql-tables.aspx

    Note that these functions live in different areas of the Excel Workbook (Objects, Modules, This Workbook), but here's a quick reference.

    I also have each of the columns that are FK validating against the tables they reference.

    Here are some code samples:

    Public aCon As New ADODB.Connection
    Public aCmd As New ADODB.Command
    
    Private Sub Workbook_Open()
      Application.EnableEvents = False
      PopulateSheet
      Application.EnableEvents = True
    End Sub
    
    Sub Connect()
      Dim sConn As String
      sConn = "Provider=SQLOLEDB;Trusted_Connection=Yes;Server=[SVR];Database=[DB]"
      With aCon
        .ConnectionString = sConn
        .CursorLocation = adUseClient
        .Open
      End With
      BuildProcs
    End Sub
    
    Sub BuildProcs()
      With aCmd
        .ActiveConnection = aCon
        .CommandType = adCmdStoredProc
        .CommandText = "[SPROC]"
        .Parameters.Append .CreateParameter("@in_EmployeeID", adInteger, adParamInput)
      End With
    
    End Sub
    
    Sub PopulateSheet()
      Dim n As Integer, r As Long
    
      Dim aCmdFetchEmployees As New ADODB.Command
      Dim aRstEmployees As New ADODB.Recordset
    
      If aCon.State = adStateClosed Then Connect
    
      With aCmdFetchEmployees
        .ActiveConnection = aCon
        .CommandType = adCmdStoredProc
        .CommandText = "[SPROC]"
        Set aRstEmployees = .Execute
      End With
      r = aRstEmployees.RecordCount
    
      Worksheets(1).Activate
      Application.ScreenUpdating = False
      Cells(2, 1).CopyFromRecordset aRstEmployees
    
      For n = 1 To aRstEmployees.Fields.Count
        Cells(1, n) = aRstEmployees(n - 1).Name
        Cells(1, n).EntireColumn.AutoFit
      Next
      Cells(1).EntireColumn.Hidden = True
    End Sub
    
    Private Sub Worksheet_Change(ByVal Target As Range)
      Dim cell As Range
      If aCon.State = adStateClosed Then Connect
        With aCmd
          .Parameters(0) = Cells(Target.Row, 1)
          .Parameters(1) = Cells(Target.Row, 4)
          .Parameters(2) = Cells(Target.Row, 5)
          .Parameters(3) = Cells(Target.Row, 6)
          .Parameters(4) = Cells(Target.Row, 7)
          .Parameters(5) = Cells(Target.Row, 8)
          .Parameters(6) = Cells(Target.Row, 10)
          .Parameters(7) = Cells(Target.Row, 11)
          .Parameters(8) = Cells(Target.Row, 12)
          .Parameters(9) = Cells(Target.Row, 13)
          .Parameters(10) = Cells(Target.Row, 14)
          .Parameters(11) = Cells(Target.Row, 15)
          .Parameters(12) = Cells(Target.Row, 16)
          .Execute , , adExecuteNoRecords
        End With
    
    End Sub
    

提交回复
热议问题