MyTetra Share
Делитесь знаниями!
Программное взаимодействие с MS SQL Server из MS Access
Время создания: 24.12.2018 07:29
Автор: yastrebkov
Раздел: Разные закладки - Microsoft SQL Server
Запись: xintrea/mytetra_db_adgaver_new/master/base/1545625779riuhmf5wt7/text.html на raw.githubusercontent.com

Недавно для одной из рабочих задач встала необходимость создания клиентского приложения для работы с базой данных на платформе MS SQL Server 2000. По условиям ТЗ клиент должен был быть выполнен в MS Access.

Ниже я привожу код, который позволяет создать подключение к SQL Server без предварительного создания DSN и создать ссылки на серверные таблицы в Access.


' Функция проверки существования таблицы в Access

'

' Parameters

' tblName - название таблицы

'

' Return Value

' True - если таблица с заданным именем существует, False - в противном случае

Public Function isTableExist(tblName) As Boolean

On Error Resume Next

Dim td As TableDef

isTableExist = False

Set td = currentDB.TableDefs(tblName)

If Err.Number = 0 Then

If td.Connect <> "" Then

isTableExist = True

End If

Set td = Nothing

End If

Err.Clear

End Function


' Функция создания ссылки в Access на таблицу в базе данных MS SQL Server

'

' Parameters

' serverName - имя или IP сервера

' serverDBName - название серверной базы данных

' tblName - название таблицы

' makeHidden - сделать таблицу скрытой (Boolean)

Public Sub linkTable(serverName, serverDBName , tblName, makeHidden)

' Если в Access уже существует таблица с таким именем ее необходимо удалить

If (isTableExist(tblName) = True) Then

DoCmd.DeleteObject acTable, tblName

End If

' Создание ссылки на серверную таблицу в Access

DoCmd.TransferDatabase acLink, "ODBC", _

"ODBC;DRIVER=SQL Server;" & _

"DATABASE=" & serverDBName & ";" & _

"APP=Microsoft Office 2003;" & _

"SERVER=" & serverName & ";" & _

"Trusted_Connection=Yes;" & _

"", acTable, tblName, tblName, False, True

' Если makeHidden = True таблица будет скрытой

Application.SetHiddenAttribute acTable, tblName, makeHidden

End Sub


В процессе выполнения предыдущей процедуры (создания ссылки), если серверная таблица не имеет ключевых полей, будет показано диалоговое окно, с предложением создания ключевых полей. Если отказаться от выбора ключевых полей редактирование и создание новых записей будет невозможно. Доступ к таблицам будет осуществляться только в режиме чтения.

Если необходимо предоставить доступ к серверным таблицам только для чтения и в подключаемых серверных таблицах нет ключевых полей, например, при создании ссылок на серверные представления (View), удобно воспользоваться следующей функцией. При создании ссылок на серверные таблицы предложений о выборе ключевых полей появляться не будет.


' Функция создания ссылки в Access на таблицу в базе данных MS SQL Server

'

' Parameters

' serverName - имя или IP сервера

' serverDBName - название серверной базы данных

' tblName - название таблицы

' makeHidden - сделать таблицу скрытой (Boolean)

Public Sub linkView(serverName, serverDBName , tblName, makeHidden)

' Если в Access уже существует таблица с таким именем ее необходимо удалить

If (isTableExist(tblName) = True) Then

DoCmd.DeleteObject acTable, tblName

End If

' Создание подключения к серверу

Set NewTableDef = currentDB.CreateTableDef(tblName)

NewTableDef.Connect = "ODBC;DRIVER=SQL Server;" & _

"UID=;" & _

"DATABASE=" & serverDBName & ";" & _

"SERVER=" & serverName & ";" & _

"PWD="

NewTableDef.SourceTableName = tblName

' Создание ссылки на серверную таблицу в Access

currentDB.TableDefs.Append NewTableDef

' Если makeHidden = True таблица будет скрытой

Application.SetHiddenAttribute acTable, tblName, makeHidden

Set NewTableDef = Nothing

End Sub


И, наконец, следующая функция иллюстрирует создание подключения к MS SQL Server без необходимости предварительного ручного или программного создания DSN.


Public Sub ExecSomeStoredProcedure(serverName, serverDBName)

Dim cnn As ADODB.Connection

Set cnn= New ADODB.Connection

cnn.Provider = "MSDataShape"

cnn.Properties("Data Provider") = "SQLOLEDB.1"

cnn.Properties("Initial Catalog") = serverDBName

cnn.Properties("Persist Security Info") = False

cnn.Properties("Data Source") = serverName

cnn.Properties("Integrated Security") = "SSPI"

cnn.Open

cnn.CommandTimeout = 90000

cnn.Execute "some_stored_procedure"

cnn.Close

Set cnn = Nothing

End Sub


Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования