【问题标题】:Use Excel 2010 to read/write to a SQL Server 2008 database using stored procedures使用 Excel 2010 通过存储过程读取/写入 SQL Server 2008 数据库
【发布时间】:2012-02-29 23:41:11
【问题描述】:

我们有一个 SQL Server 2008 数据库,其中包含处理读取/写入/等操作的存储过程。这些过程被内部的各种应用程序使用。

需要一个人直接更新数据库中名为 Employee 的表之一。更新很简单;更新 VARCHAR 和 INT(外键)字段。问题是SharePoint 2010 不容易通过BCS 支持这种更新;浏览和更新并不是最好的用户体验。

有人建议使用 Excel 和 VBA 可以轻松解决此问题。打开时,Excel 连接到 SQL Server 数据库并从 Employee 读取存储过程中读取。它还为外键引用的表执行读取存储过程。用户对字段进行更新,该字段又调用 Employee update sproc。

这样做的好处是没有需要构建/托管/等的网站界面;如果使用 Active Directory 进行身份验证,则 DBA 可以使用这种方法。

问题是我找不到 VBA 程序员或任何有用的资源或分步演练来编写 VBA。

是否有人知道这样的在线资源和/或对如何为单个用户快速启动和运行管理界面有其他建议?

【问题讨论】:

    标签: excel sql-server-2008 vba sharepoint stored-procedures


    【解决方案1】:

    我最终采用了这种使用 AD 身份验证的方法。我使用这篇文章中的示例来获得灵感: http://www.eggheadcafe.com/community/sql-server/13/10141669/using-excel-to-update-data-on-ms-sql-tables.aspx

    请注意,这些函数位于 Excel 工作簿的不同区域(对象、模块、本工作簿),但这里有一个快速参考。

    我还让每个列都针对它们引用的表进行 FK 验证。

    以下是一些代码示例:

    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
    

    【讨论】:

      【解决方案2】:

      您好,您可以从这里开始。

      在您的 excel 文件上创建宏按钮。单击新建,然后添加此代码。

      Sub Button1_Click()
      Dim cnt As ADODB.Connection
      Dim rst As ADODB.Recordset
      Dim stSQL As String
      Dim SNfound As String
          'Your sqlserver 2008 connection string
          Const stADO As String = "Provider=SQLOLEDB.1;" & _
          "" & _
          "Initial Catalog=YOurDB;" & _
          "Data Source=YourServer;UID=yourusername;PWD=yourpassword;"
      
      
           'SELECT FROM STORED PROCEDURE
           ' eg: select SN from SNTable where SN=@SN
               stSQL = "exec usp_SelectSN '" & "TESTSN" & "'"  
              Set cnt = New ADODB.Connection
              With cnt
                        .CursorLocation = adUseClient
                        .Open stADO
                        .CommandTimeout = 0
              Set rst = .Execute(stSQL)
              End With
      
                      If rst.RecordCount = 0 Then
                            'NO SN FOUND ON YOUR DB
                      Else
      
                            'RECORDS FOUND SHOW Retrieve SN from DB to message box
                          SNfound = rst.Fields("SN")
      
                          MsgBox ("Found:" & SNfound)
      
                      End If
      
                      Set rst = Nothing
                      Set cnt = Nothing
      
      End Sub
      

      问候

      【讨论】:

      • 谢谢您...我复制了您的代码,并立即在第一行出现错误。我采用这种方法(不太健壮)来加载数据。 Sub Load() sqlstring = " exec usp_GetEmployeeList" connstring = _ "ODBC;DSN=[SVR];UID=;PWD=;Database=[DB]" With ActiveSheet.QueryTables.Add(Connection:=connstring, Destination:=Range ("A1"), Sql:=sqlstring) .Refresh End With End Sub
      • 现在我需要弄清楚如何写回更新存储过程
      【解决方案3】:

      我建议您创建一个简单的 Webpart 来进行编辑。与 vba 相比,您将更容易找到可以对数据库执行 C# 的人。 以这种方式为任何编码编写一个非常粗糙的 webpart 非常容易。

      还有大量可用的 C# 和 webpart 编码示例。

      您还可以将代码保存在服务器上,而不会在办公文档中以明文形式公开用户名/密码组合。

      如果随着时间的推移,解决方案变得更加关键,这种方法还可以让您顺利提高解决方案的“质量”。

      听起来您确实在关注covered nicely by this example 的场景

      【讨论】:

        猜你喜欢
        • 2013-02-08
        • 1970-01-01
        • 2013-07-17
        • 2015-01-26
        • 1970-01-01
        • 1970-01-01
        • 2014-06-16
        • 1970-01-01
        • 2012-11-15
        相关资源
        最近更新 更多