Используйте Excel 2010 для чтения / записи в базу данных SQL Server 2008 с помощью хранимых процедур - PullRequest
4 голосов
/ 01 марта 2012

У нас есть база данных SQL Server 2008, в которой хранятся процедуры для операций чтения / записи / и т. Д. Эти процедуры используются различными внутренними приложениями.

Возникла необходимость в том, чтобы один человек обновлял непосредственно одну из таблиц в базе данных с именем Employee. Обновление очень просто; обновить поля VARCHAR и INT (внешний ключ). Проблема в том, что SharePoint 2010 с трудом поддерживает такие обновления через BCS; просмотр и обновление не лучший пользовательский опыт.

Предполагается, что это легко решить с помощью Excel и VBA. При открытии Excel подключается к базе данных SQL Server и выполняет чтение из хранимой процедуры чтения сотрудника. Он также выполняет операции чтения для таблиц, на которые ссылаются внешние ключи. Пользователь вносит обновление в поле, которое, в свою очередь, вызывает sproc обновления Employee.

Преимущества этого состоят в том, что нет интерфейса веб-сайта, который нужно создавать / размещать / и т. Д .; администратор БД подходит для такого подхода, если для аутентификации используется Active Directory.

Проблема в том, что я не могу найти программиста VBA или какие-либо полезные ресурсы или пошаговые инструкции по написанию VBA.

Кто-нибудь знает о таком онлайн-ресурсе и / или имеет альтернативное предложение о том, как быстро настроить и запустить интерфейс администратора для одного пользователя?

Ответы [ 3 ]

4 голосов
/ 02 апреля 2012

В итоге я использовал этот подход, используя аутентификацию AD.Я использовал пример в этом посте для вдохновения: http://www.eggheadcafe.com/community/sql-server/13/10141669/using-excel-to-update-data-on-ms-sql-tables.aspx

Обратите внимание, что эти функции находятся в разных областях книги Excel (объекты, модули, эта книга), но вот краткий справочник.1005 *

У меня также есть каждый из столбцов, проверяемых 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
0 голосов
/ 01 марта 2012

Я бы порекомендовал вам создать простую веб-часть, которая выполняет редактирование.Вам будет легче найти кого-то, кто может использовать C # в базе данных, чем vba.Кодировать очень грубую веб-часть для любого кодирования таким способом довольно легко.

Существует также множество примеров кодирования для C # и веб-частей.

Вы также можете хранить код на сервере, не выставляя комбинации имени пользователя и пароля в открытом тексте в офисеdocument.

Этот подход также позволяет плавно улучшить «качество» решения, если со временем оно становится более критически важным.хорошо освещено в этом примере

0 голосов
/ 01 марта 2012

Привет, ты можешь начать с этого.

Создать кнопку макроса в вашем файле Excel. Нажмите New и затем добавьте этот код.

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

Привет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...