powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Перенос данных с MS-SQL в локальную .MDB. А как еще можно?
13 сообщений из 13, страница 1 из 1
Перенос данных с MS-SQL в локальную .MDB. А как еще можно?
    #32826596
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот появилась задача:
скопировать структуру и содержимое некоей таблицы с MS-SQL сервера в локальный файл .MDB

Ниже приведены два варианта решения:
1) Перенос предварительно заполненной на сервере спец. таблицы с блокировкой таблицы через DoCmd.TransferDatabase.
НЕДОСТАТКИ: приходится блокировать таблицу на момент переноса, т.к. ее содержание зависит от пользователя и одновременный перенос данных двумя пользователями .
ДОСТОИНСТВА: быстро.

2) Перенос структуры предварительно созданной на сервере спец. таблицы через DoCmd.TransferDatabase.
+ копирование данных из View в локальную таблицу .MDB через recordset-ы.
НЕДОСТАТКИ: медленно.
ДОСТОИНСТВА: не надо блокировать таблицу на момент переноса, т.к. ее содержание не используется и возможен одновременный перенос данных двумя и более пользователями.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
' Перенос таблицы с MS-SQL в файл .MDB (имя MDB задано константой csDbPathName, MS-SQL - текущим подключением ADP-проекта)

'1) Вариант с DoCmd.TransferDatabase - перенос предварительно заполненной на сервере спец. таблицы с блокировкой таблицы
Public Function TransferDbTable_TransferDatabase(aTableName As String) As Boolean
  Dim HaveLock As Boolean
  On Error GoTo ErrorExit
  loi_WrLn "Перенос таблицы [" + aTableName + "]..."
  loi_IncLevel
  
  ' Перенос структуры
  HaveLock = GetAppLock("trtbl_" + aTableName, "Exclusive", "Session") >=  0 
  If Not HaveLock Then
    loi_IncLevel
    loi_WrLn "Ожидание доступа к таблице..."
    HaveLock = GetAppLock("trtbl_" + aTableName, "Exclusive", "Session",  5  *  1000 ) >=  0 
    If HaveLock Then
      loi_Wr "ОК."
    Else
      loi_WrLn "Не удается получить доступ к " + aTableName + "!"
    End If
    loi_IncLevel - 1 
  End If
  If HaveLock Then
     ' заполнение таблицы
     loi_WrLn "Перенос данных..."
     CurrentProject.Connection.Execute "dbo.M_" + aTableName + "_FillIn", , adCmdStoredProc + adExecuteNoRecords
     DoCmd.TransferDatabase _
      TransferType:=acExport, _
      DatabaseName:=csDbPathName, _ ' 
      DataBasetype:="Microsoft Access", _
      ObjectType:=acTable, _
      Source:="dbo." + aTableName, _
      Destination:=aTableName, _
      StructureOnly:=False
    ReleaseAppLock "trtbl_" + aTableName, "Session"
    loi_Wr "OK."
  End If
  
  TransferDbTable_TransferDatabase = True
  loi_IncLevel - 1 
  loi_WrLn "Перенос таблицы OK."
Exit Function
ErrorExit:
  LogVBAError Err, "TransferDbTable_TransferDatabase", aTableName
  On Error Resume Next
  loi_IncLevel - 1 
  loi_WrLn "Ошибка переноса таблицы" + aTableName + "!"
End Function

'-------------------------------------------------------------
'2) Вариант с DoCmd.TransferDatabase - перенос структуры предварительно созданной на сервере спец. таблицы + копирование данных через recordset.

Public Function TransferDbTable_RecordsetCopy(aTableName As String) As Boolean
On Error GoTo ErrorExit
  loi_WrLn "Перенос таблицы [" + aTableName + "]..."
  loi_IncLevel
  
  ' Перенос структуры
  loi_Wr "Перенос структуры..."
  DoCmd.TransferDatabase _
    TransferType:=acExport, _
    DatabaseName:=csDbPathName, _
    DataBasetype:="Microsoft Access", _
    ObjectType:=acTable, _
    Source:="dbo." + aTableName, _
    Destination:=aTableName, _
    StructureOnly:=True
  loi_WrLn "OK."
       
  loi_WrLn "Перенос данных..."
  ' Перенос данных
  Dim Src As ADODB.Recordset
  Dim Dst As ADODB.Recordset

 ' Открываем набор данных с источника (здесь открывается Представление)
  Set Src = New ADODB.Recordset
  With Src
    .CursorType = adOpenForwardOnly
    .LockType = adLockReadOnly
    .Open "dbo.M_" + aTableName, CurrentProject.BaseConnectionString, , , adCmdTable
  End With
  
 ' Открываем набор данных с назначения
  Set Dst = New ADODB.Recordset
  With Dst
    .CursorType = adOpenKeyset
    .LockType = adLockBatchOptimistic
    .CursorLocation = adUseClient
    .Open aTableName, dbPIConnection, , , adCmdTable
  End With
  
  ' Копируем данные
  Dim i As Long, f As String, flds() As String
  ReDim flds(Src.Fields.Count -  1 ) As String
  For i =  0  To Src.Fields.Count -  1 
    flds(i) = Src.Fields(i).Name
  Next
  While Not Src.EOF
    Dst.AddNew
    For i =  0  To Src.Fields.Count -  1 
      f = flds(i)
      Dst.Fields(f) = Src.Fields(f)
    Next
    Src.MoveNext
  Wend
  Dst.UpdateBatch
    
  Src.Close
  Dst.Close
  Set Src = Nothing
  Set Dst = Nothing
  loi_Wr "OK."
  
  TransferDbTable_RecordsetCopy = True
  loi_IncLevel - 1 
  loi_WrLn "Перенос таблицы OK."
Exit Function
ErrorExit:
  LogVBAError Err, "TransferDbTable_RecordsetCopy", aTableName
  On Error Resume Next
  loi_IncLevel - 1 
  loi_WrLn "Ошибка переноса таблицы" + aTableName + "!"
End Function
...
Рейтинг: 0 / 0
Перенос данных с MS-SQL в локальную .MDB. А как еще можно?
    #32826621
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
help DTS
...
Рейтинг: 0 / 0
Перенос данных с MS-SQL в локальную .MDB. А как еще можно?
    #32826649
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DTS не годится.

В реальности MS-SQL сервер не имеет доступа к MDB-файлу - используется Citrix и диск клиента, доступный только из терминальной сессии.
--------------
Еще идеи?
...
Рейтинг: 0 / 0
Перенос данных с MS-SQL в локальную .MDB. А как еще можно?
    #32826691
Александр Спелицин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам это один раз нужно сделать или постоянно?
Если один раз, то выполняете в QA запрос
Select * from <Ваша таблица>, затем сохраняете результат в txt файл и импортируете из это файла данные аксесом.
...
Рейтинг: 0 / 0
Перенос данных с MS-SQL в локальную .MDB. А как еще можно?
    #32826708
Александр Спелицин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вдогонку:
А чем не устраивает присоединение таблиц и выполнение простейшего запроса на добавление
Insert Into <mdb_table>
Select * from <Linked_Table>?
...
Рейтинг: 0 / 0
Перенос данных с MS-SQL в локальную .MDB. А как еще можно?
    #32826711
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то я не понимаю проблемы.
Бысто слить таблицу из MS SQL в mdb (локальный для MSSQL ), а потом неспешно через Citrix тянуть этот mdb на клиента любым способом (или копированием файла, или импортом, как удобнее)
...
Рейтинг: 0 / 0
Перенос данных с MS-SQL в локальную .MDB. А как еще можно?
    #32826728
Фотография Latuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну ежели просто таблицы то я делал
через создание в mdb запроса к серверу и исполнение его через SELECT INTO
такой панимаеш гетерогенный DAO запрос

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
    Dim dbe As DAO.DBEngine
    Dim db As DAO.Database
'--Создаю Mdb-k

Set dbe = New DAO.DBEngine

'--Удалить если существует

    If Dir(CurrentProject.Path + "\" + GetUserName() + "__tmpDSA_MJ.mdb", vbNormal) <> "" Then _
        Kill CurrentProject.Path + "\" + GetUserName() + "__tmpDSA_MJ.mdb"
    Set db = dbe.Workspaces( 0 ).CreateDatabase(CurrentProject.Path + "\" + GetUserName() + "__tmpDSA_MJ.mdb", dbLangGeneral)

'--создаю запрос к серверу

    Set q = db.CreateQueryDef("spq")
'строка конекта к серверу
    q.Connect = "ODBC;DRIVER={SQL Server};Network=DBMSSOCN;SERVER=" + GetServerName() + ";DATABASE=" + GetDBName() + ";Trusted_Connection=yes;dsn=;"
'строка запроса (выполнение ХП с параметрами)
    q.SQL = "exec dbo.DSA_MJ_p '" + SQLDate(dtDateBeg()) + "','" + SQLDate(dtDateEnd()) + "'"
    q.Close
    'создаю таблицу из запроса к серверу
    db.Execute "select * INTO TmpWr from spq"
'Делаю в ней ключи
    db.Execute "ALTER TABLE TmpWr Add CONSTRAINT PrimaryKey PRIMARY KEY (MeetingID)"

Если реч не только об таблице но и о mdb-ке с несколькими объектами
то иногда быстрее получается запихнуть его в имидж и перекачать через адо стрим
Код: plaintext
1.
2.
3.
4.
5.
6.
        Set mstream = New ADODB.Stream
        mstream.Type = adTypeBinary
        mstream.Open
        mstream.Write rs.Fields( 1 ).Value
        mstream.SaveToFile Path & "\" & rs.Fields( 0 ).Value, adSaveCreateOverWrite
        LoadFileFromServer = Path & "\" & rs.Fields( 0 ).Value
...
Рейтинг: 0 / 0
Перенос данных с MS-SQL в локальную .MDB. А как еще можно?
    #32827092
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уточняю:
1) Клиент должен это делать периодически (достаточно часто).
2) Клиент это составной проект:
1. основной ADP-проект - работающий на сервере Citrix при подключении.
2. автономный ADP-проект - работающий у удаленного пользователя.
3) Решения на базе DAO нежелательны.

Автономный ADP-проект использует MDB базу для ввода в нее неких данных.

Основной ADP-проект при подключении к Citrix-у забирает эти данные с клиентского компа и заносит на MS-SQL.

Использование MDB неизбежно, поскольку Citrix обеспечивает только доступ к файловой системе клиентского компа (про VPN слышал и видел - не канает по тех. причинам).

Для правильного и удобного ввода в MDB-базе необходимо периодически обновлять данные, синхронизируя их с SQL-сервером (ну, грубо говоря, делать заготовку таблицы для ввода).


Отсюда:
>>А чем не устраивает присоединение таблиц и выполнение простейшего запроса на добавление

Линкованные таблицы доступны только в MDB, а здесь ADP.

>>Бысто слить таблицу из MS SQL в mdb (локальный для MSSQL ), а потом неспешно через Citrix тянуть этот mdb на клиента любым способом (или копированием файла, или импортом, как удобнее).

копированием файла - не годится, там другие данные есть.
или импортом - именно так, только как?
...
Рейтинг: 0 / 0
Перенос данных с MS-SQL в локальную .MDB. А как еще можно?
    #32827114
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант реализации. Приложение(аксессовое )запускается клиентом в сессии на Citrix servere,
тянет данные с MSSQL в локальную таблицу/базу mdb (локальную по оношению к Citrix серверу), а затем экспортом проталкивает таблицу на клиента.
Про импорт - опечатка вышла.
...
Рейтинг: 0 / 0
Перенос данных с MS-SQL в локальную .MDB. А как еще можно?
    #32827131
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторпоскольку Citrix обеспечивает только доступ к файловой системе клиентского компа Это заблуждение :) Citrix умеет COM , LPT порты пробрасывать, звук и потоковое видео, а так же всё что программист пожелает написавший пару DLL - одна для клиента, вторая- для сервера

и VPN здесь ни при чём.
...
Рейтинг: 0 / 0
Перенос данных с MS-SQL в локальную .MDB. А как еще можно?
    #32827722
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Sh авторпоскольку Citrix обеспечивает только доступ к файловой системе клиентского компа Это заблуждение :) Citrix умеет COM , LPT порты пробрасывать, звук и потоковое видео, а так же всё что программист пожелает написавший пару DLL - одна для клиента, вторая- для сервера

и VPN здесь ни при чём.

Во-во, я тож думаю ежели не COM-порт, то "потоковое видео" - это то, что надо. Осталось MDB замаскировать под "потоковое видео", может подкинешь идею?

Alexey Sh
Вариант реализации. Приложение(аксессовое )запускается клиентом в сессии на Citrix servere,
тянет данные с MSSQL в локальную таблицу/базу mdb (локальную по оношению к Citrix серверу), а затем экспортом проталкивает таблицу на клиента.


Гм, а чем эти яйца отличаются от первоначальных?
См. 1-й пост.
Только промежуточным: тянет данные с MSSQL в локальную таблицу/базу mdb (локальную по оношению к Citrix серверу).

Ежели приложение может "экспортом проталкивать таблицу на клиента", то почему бы сразу "экспортом не протолкнуть таблицу на клиента с SQL-сервера"?

Вопрос и был: как (кроме предложенных в 1-м посте способов)?
...
Рейтинг: 0 / 0
Перенос данных с MS-SQL в локальную .MDB. А как еще можно?
    #32827977
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторГм, а чем эти яйца отличаются от первоначальных?
См. 1-й пост.
Только промежуточным: тянет данные с MSSQL в локальную таблицу/базу mdb (локальную по оношению к Citrix серверу).

Ежели приложение может "экспортом проталкивать таблицу на клиента", то почему бы сразу "экспортом не протолкнуть таблицу на клиента с SQL-сервера"?

Вопрос и был: как (кроме предложенных в 1-м посте способов)?
Отличие - в скорости выгрузки из MSSQL. (в первоначальных яйцах стоял вопрос о блокировках). Запись на локальный диск цитриксного клиента может быть нетороппливой
...
Рейтинг: 0 / 0
Перенос данных с MS-SQL в локальную .MDB. А как еще можно?
    #32828001
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВо-во, я тож думаю ежели не COM-порт, то "потоковое видео" - это то, что надо. Осталось MDB замаскировать под "потоковое видео", может подкинешь идею?

Идея проста :) берётся Citrix® Virtual Channel Software Development Kit
с www.citrix.com, там документация и три примера. Предупреждаю, интерфейс клиентской части - дурной, из-за мультиплатформенности
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Перенос данных с MS-SQL в локальную .MDB. А как еще можно?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]