Я использую этот код для прикрепления таблицы без DSN.
'//Name : AttachDSNLessTable
'//Purpose : Create a linked table to SQL Server without using a DSN
'//Parameters
'// stLocalTableName: Name of the table that you are creating in the current database
'// stRemoteTableName: Name of the table that you are linking to on the SQL Server database
'// stServer: Name of the SQL Server that you are linking to
'// stDatabase: Name of the SQL Server database that you are linking to
'// stUsername: Name of the SQL Server user who can connect to SQL Server, leave blank to use a Trusted Connection
'// stPassword: SQL Server user password
Function AttachDSNLessTable(stLocalTableName As String, stRemoteTableName As String, stServer As String, stDatabase As String, Optional stUsername As String, Optional stPassword As String)
On Error GoTo AttachDSNLessTable_Err
Dim td As TableDef
Dim stConnect As String
For Each td In CurrentDb.TableDefs
If td.Name = stLocalTableName Then
CurrentDb.TableDefs.Delete stLocalTableName
End If
Next
If Len(stUsername) = 0 Then
'//Use trusted authentication if stUsername is not supplied.
stConnect = "ODBC;DRIVER=SQL Server;SERVER = " & stServer & ";DATABASE = " & stDatabase & ";Trusted_Connection=Yes"
Else
'//WARNING: This will save the username and the password with the linked table information.
stConnect = "ODBC;DRIVER=SQL Server;SERVER = " & stServer & ";DATABASE = " & stDatabase & ";UID = " & stUsername & ";PWD = " & stPassword
End If
Set td = CurrentDb.CreateTableDef(stLocalTableName, dbAttachSavePWD, stRemoteTableName, stConnect)
CurrentDb.TableDefs.Append td
AttachDSNLessTable = True
Exit Function
AttachDSNLessTable_Err:
AttachDSNLessTable = False
MsgBox "AttachDSNLessTable encountered an unexpected error: " & Err.Description
End Function
Предположим, я изменил схему связанных таблиц с помощью ADO:
cn.execute "Alter table table 1 add add Name string not null"
Я знаю, что это изменит таблицу в SQL Server.
Я думал, что связанные таблицы в MS Access всегда отражают любые изменения, внесенные в таблицы в SQL Server. Почему нам нужно удалить локальную таблицу и заново связать ее, чтобы отразить изменения схемы?
Почему изменения данных отражаются, а изменения схемы - нет?
Диспетчер связанных таблиц в пользовательском интерфейсе Access позволяет обновлять связанные таблицы, не удаляя их. Я не уверен, что делает «освежение», поскольку оно вполне может удалять и повторно добавлять их за укрытием, но, похоже, это не то, что он делает. Проверяли ли вы документацию TableDef на предмет метода обновления связанной схемы? См. Метод DAO TableDef.RefreshLink
Хорошо, из того, что я нашел, вы можете обновить ссылку. Но я нашел ответ в сообщении это, в котором говорилось, что «потому что таблицы, связанные ODBC, плохо обновляются для SQL Server. Я бы удалил все ссылки на таблицы и воссоздал их с нуля». В основном для Access с MS Access с обновлением серверной части SQL по сравнению с удалением и повторным связыванием происходит то же самое. Сказав, что этот ответ не дал никакой дополнительной информации о том, почему это происходит, я не уверен.
Не верьте всему, с чем сталкиваетесь. Метод Refresh
- это все, что вам нужно, и он работает безупречно.
Простой ответ заключается в том, что только изменения схемы сохраняются и собираются во время компоновки из соображений производительности.
Связанная таблица не имеет возможности узнать, что структура таблицы была изменена, до тех пор, пока вы не укажете Access для проверки (просто обновив таблицу).
Я имею в виду, когда вы находитесь на веб-странице, они могут добавлять новые статьи или изменять макет. Затем веб-сервер не обращается ко всем в Интернете и не сообщает им, что страница была обновлена. Похоже на глупый подход.
Структура таблицы вытягивается во время связывания. Если каждый раз прикасаться к таблице или использовать ее, производительность будет сильно снижаться, и придется выполнять множество дополнительных проверок, болтовни и связи с сервером.
Если связанная таблица не сохранила информацию о локальной схеме, у вас не было бы этой проблемы.
Однако связывание с таблицей не только сохраняет информацию о соединении, но также сохраняет информацию о структуре таблицы.
Получение данных из таблицы - впечатляющее и серьезное отличие проблемы от запроса sql-сервера на отправку всей структуры таблицы. (И что, если бы это было так - вам ВСЕГДА придется обновлять локальную информацию).
Я имею в виду, что в моей форме может быть 2 поля из 150. Зачем мне нужно, чтобы вся эта масса информации спускалась по сетевому каналу только для отображения двух текстовых полей в форме? Почему 150 столбцов информации (имя, длина, тип данных, автоматический номер и т. д., Индексирование должны падать каждый раз)?
Вы видели таблицу соответствия для каждого столбца в sql? Это довольно большой объем информации. Фактически, эта информация представляет собой довольно большой объем данных, когда у вас есть 100 или более столбцов. Информация, отправленная по сетевому каналу, будет БОЛЬШЕ, чем данные, содержащиеся в одной небольшой записи, которую вы редактируете !!!
Я имею в виду, что вы можете ссылаться на представление на сервере sql, которое включает только несколько столбцов. Таким образом, каждый запрос и использование этого представления будет извлекать только столбцы, определенные во время просмотра.
Фактически, даже другие представления на сервере sql могут с трудом обновляться при изменении представления. В результате даже запросы на запросы (представления на представлениях) ДАЖЕ при использовании чистого sql-сервера часто необходимо «сообщать», что структура данных и столбцы, с которых вы изначально начали, были изменены.
Таким образом, связанные таблицы в Access не сильно отличаются от сохраненных представлений на сервере sql. Если вы обновляете базовые таблицы, вам необходимо выполнить команду sp_refeshview на сервере sql, чтобы обновить представление, чтобы узнать об этих изменениях.
Я имею в виду, если вы берете текстовый документ с сервера, а другие начинают изменять копию на сервере, каждая рабочая станция знает об изменениях? Сервер сейчас выходит на связь?
Таким образом, информация о схеме сохраняется во время связывания, и воссоздание и построение схемы не происходит просто «с использованием» связанной таблицы. У вас есть доступ к перезагрузке схемы при внесении изменений.
Необходимость проверять схему и обновлять информацию в доступе для каждой записи или каждый раз, когда вы захватываете некоторые данные, является дорогостоящим и трудоемким процессом.
Поскольку для 99,9% извлечения данных схема не меняется, поэтому все эти накладные расходы на извлечение и тестирование схемы каждый раз не имеют большого смысла (это было бы плохой идеей и дизайном).
Как уже отмечалось, даже если не используется Access и используются представления на сервере sql, которые указывают на существующие таблицы, схема сохраняется в этом представлении до тех пор, пока вы не обновите это представление.
И эта проблема и проблема, конечно же, не ограничивается доступом к серверной части доступа или доступом к серверной части sql. Большинство продуктов баз данных просто не обновляют неожиданно такие вещи, как представления, которые сохраняют исходную схему из соображений производительности.
То есть я нахожусь в форме доступа и перехожу к следующей записи. Вы говорите мне сейчас, что Access должен начать разговаривать с сервером и спрашивать, была ли изменена схема? Нет никакого смысла заставлять клиента собирать всю эту информацию и повторно сохранять информацию схемы.
Я полагаю, что, возможно, при каждом первом использовании таблицы для данного сеанса Access может запрашивать эту информацию, но на самом деле, как насчет всех пользователей, работающих в настоящее время? Они все равно не видят изменения схемы.
Изменения схемы также довольно редки. Если они возникают часто, значит, что-то не так с разработчиками, а не с системой баз данных.
Это неприятный аспект работы с источниками данных ODBC, и нет другого выхода, кроме обновления связанных таблиц.