使用Excel 2010使用存储过程读/写SQL Server 2008数据库
我们有一个SQL Server 2008数据库,该数据库具有处理读/写等操作的存储过程。这些过程在内部由各种应用程序使用 现在需要一个人直接更新数据库中一个名为Employee的表。更新非常简单;更新VARCHAR和INT(外键)字段。问题是SharePoint 2010不容易通过BCS支持此类更新;浏览和更新并不是最好的用户体验 有人建议用Excel和VBA很容易解决这个问题。打开时,Excel连接到SQL Server数据库并从Employee read存储过程中读取。它还为外键引用的表执行读取存储过程。用户对一个字段进行更新,该字段反过来调用Employee update存储过程 这样做的好处是,不需要构建/托管/等网站界面;如果使用Active Directory进行身份验证,DBA可以使用这种方法 问题是我找不到VBA程序员或任何有用的资源,也找不到编写VBA的分步走查使用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存储过程中读取。它还为外键引用的表执行
是否有人知道此类在线资源和/或对如何快速为单个用户建立并运行管理界面有其他建议?您好,您可以从这里开始 在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)加载子对象