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

我们有一个SQL Server 2008数据库存储过程来处理读取/写入等。 这些程序在内部被各种应用程序使用。

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

有人build议,这很容易用Excel和VBA解决。 打开时,Excel连接到SQL Server数据库并从Employee读取存储过程读取。 它还执行外键引用的表的读取sprocs。 用户更新一个字段,然后调用Employee update sproc。

这样做的好处是没有网站界面需要build立/托pipe/等; 如果使用Active Directory进行身份validation,则DBA可以使用此方法。

问题是,我无法findVBA程序员或任何有用的资源,或者一步一步走过来编写VBA。

有没有人知道这样的在线资源和/或有一个替代的build议,如何快速获得pipe理界面和单个用户运行?

我最终用这种方法使用ADauthentication。 我用这个post中的例子来获得灵感: http : //www.eggheadcafe.com/community/sql-server/13/10141669/using-excel-to-update-data-on-ms-sql-tables.aspx

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

我也有每个FKvalidation他们引用表的列。

以下是一些代码示例:

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 

嗨,你可以从这开始。

在你的excel文件上创buildmacrosbutton。 点击新build,然后添加此代码。

 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 

问候

我会build议您创build一个简单的Web部件来进行编辑。 你会更容易find一个人可以做C#数据库比VBA。 以这种方式编码一个非常粗糙的webpart到任何代码是非常容易的。

也有大量的C#和webparts可用的编码样本。

您还可以将代码保留在服务器上,而不必在办公文档中以明文显示用户名/密码组合。

这种方法还可以使您顺利地提高解决scheme的“质量”,如果它随着时间的推移变得越来越重要的话。

这听起来确实是你正在遵循这个例子很好地覆盖的情况