允许用户直接连接到您的数据库是棘手的。首先,你暴露自己从外部攻击,因为用户帐户比隔离好的管理和服务帐户更频繁地被入侵。话虽如此,用户帐户确实需要进行攻击才能让攻击者进入系统,并且如果每个用户都有自己的凭证,则SQL Server中内置的控件具有良好的粒度。
使用Excel本地接口与通过VBA或VSTA进行的操作没有什么不同,这是大多数开发人员在过去十年左右的工作方式。这些方法与您的网络一样安全。我相信Excel本地功能也可以在没有外部引用的情况下工作,这对于维护目的来说特别好。主要区别似乎在于执行任意查询的能力。出于安全性和数据完整性目的,这可能是最好的。
运行存储过程可能不是一个好主意,因为如果用户开始频繁地调整需要(需要)调整,则可以进入大量支持需求。你能做一个看法吗? Excel的内置过滤和排序功能非常强大。那将是我的第一个方法。
有根据您的需要的几种方法:
1 - 修改您的架构允许数据库将数据绑定到个别用户
2 - 的访问代码转移到关联的工作簿中的VBA宏。这不被推荐,但它可以让你直接使用ADO。如果您这样做,请确保您在数据库方面拥有可靠的安全配置,因为攻击者可以访问用户的帐户,并且可以执行任何用户可以执行的操作。
要走VBA路线,在VBA环境的Tools-> References中找到最新的Microsoft ADO版本。 VBA代码看起来是这样的:
Dim Connection as ADODB.Connection
Set Connection = new ADODB.Connection
Connection.Open"Provider=SQLNCLI;Server=myServerAddress;Database=myDataBase;Trusted_Connection=yes;"
Dim command As ADODB.command
command.CommandText = "exec sp_something"
Dim Parameters(2) As ADODB.Parameter
Set Parameters(1) = New ADODB.Parameter
Parameters(1).Name = "field_name"
Parameters(1).Type = adVarChar
Parameters(1).Size = 50
Set Parameters(2) = New ADODB.Parameter
Parameters(2).Name = "field_name_2"
Parameters(2).Type = adVarChar
Parameters(2).Size = 50
Dim i As Integer
For i = LBound(Parameters) To UBound(Parameters)
command.Parameters.Append Parameters(i)
Next i
Dim Records As ADODB.Recordset
Set Records = command.Execute
领带宏您的按钮,通过该表或输入框中设置你的价值观,以及火。但我会重复我的警告:以这种方式导致巨大的支持需求。如果人们想要提取自定义数据,那么他们对此非常关注。
难道你不能使用Web界面吗?执行存储过程并返回csv/xls非常简单。从excel这样做似乎完全没有必要。 – user606723 2012-01-27 17:34:05
@ user606723我完全同意你的观点,但是我的老板想用excel – 2012-01-27 17:37:09
因为你将分发这个VBA,我会尽量使VBA尽可能的小而简单。一个好办法,就是让VBA从网页界面下载一个CSV = p。你也应该试着说服你的老板,在Excel中这样做是可怕的解决方案。 – user606723 2012-01-27 17:41:50