Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Excel 2010使用存储过程读/写SQL Server 2008数据库_Excel_Sql Server 2008_Vba_Sharepoint_Stored Procedures - Fatal编程技术网

使用Excel 2010使用存储过程读/写SQL Server 2008数据库

使用Excel 2010使用存储过程读/写SQL Server 2008数据库,excel,sql-server-2008,vba,sharepoint,stored-procedures,Excel,Sql Server 2008,Vba,Sharepoint,Stored Procedures,我们有一个SQL Server 2008数据库,该数据库具有处理读/写等操作的存储过程。这些过程在内部由各种应用程序使用 现在需要一个人直接更新数据库中一个名为Employee的表。更新非常简单;更新VARCHAR和INT(外键)字段。问题是SharePoint 2010不容易通过BCS支持此类更新;浏览和更新并不是最好的用户体验 有人建议用Excel和VBA很容易解决这个问题。打开时,Excel连接到SQL Server数据库并从Employee read存储过程中读取。它还为外键引用的表执行

我们有一个SQL Server 2008数据库,该数据库具有处理读/写等操作的存储过程。这些过程在内部由各种应用程序使用

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

有人建议用Excel和VBA很容易解决这个问题。打开时,Excel连接到SQL Server数据库并从Employee read存储过程中读取。它还为外键引用的表执行读取存储过程。用户对一个字段进行更新,该字段反过来调用Employee update存储过程

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

问题是我找不到VBA程序员或任何有用的资源,也找不到编写VBA的分步走查


是否有人知道此类在线资源和/或对如何快速为单个用户建立并运行管理界面有其他建议?

您好,您可以从这里开始

在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

关于

我建议您创建一个简单的Web部件来进行编辑。与vba相比,您将更容易找到能够对数据库进行C#to的人。 以这种方式将一个非常粗糙的Web部件编码为任何编码都是非常容易的

还有大量C#和Web部件的编码示例可用

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

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


听起来您确实在遵循一个场景

我最终采用了使用AD身份验证的方法。我在这篇文章中用了这个例子作为灵感:

请注意,这些函数位于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

谢谢你。。。我复制了你的代码,第一行就出现了错误。我使用这种方法(不太健壮)加载数据。使用ActiveSheet.QueryTables.Add(连接:=connstring,目标:=Range(“A1”),Sql:=sqlstring)和ActiveSheet.QueryTables.Add(连接:=connstring,目的地:=Range(“A1”),Sql:=sqlstring)加载子对象