powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / AccessXP+SQLserver2000
7 сообщений из 7, страница 1 из 1
AccessXP+SQLserver2000
    #32281507
2AN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нужно линковать таблицы из SQLserver и mdb, т.к. приложение должно работать с разными БД.

1. Есть прилинкованные таблицы из mdb-файла. Через link-manager можно переключится на те же таблицы в SQL-server. Наоборот - нельзя, всё время хочет ODBC. Аналогичная ситуация с .RefreshLink. Что делать?

2. При линковке таблиц из SQLserver Access всё время спрашивает поле для индекса (хотя оно есть в SQLserver). Если его не указать - таблица только для чтения. Что делать, если линкую таблицу через .RefreshLink?
...
Рейтинг: 0 / 0
AccessXP+SQLserver2000
    #32281536
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Навскидку - програмно убивай связь и делай заново.
2. После .RefreshLink делай CurrentDb.Execute "Create Unique Index IndexName On TableName (FieldName Asc/Desc)". В синтаксисе мог ошибиться, но смысл такой.
...
Рейтинг: 0 / 0
AccessXP+SQLserver2000
    #32281632
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если индексы есть, то проще не перелинковывать, а снести старые таблы и занова подлинковаться - по умолчанию существующие ключи должны найтись. Для этого надо иметь таблицу "прилинковываемых таблиц". Реализацию ( некоего SSY ) правда видел не для MSSQL, но для PosgreSQL (Access97). Что не принципиально. Сделано разумно. Обобщить на случай возможности выбора произвольного драйвера (ODBC/isam/Jet) в процессе подключения не сложно.

Что важно - при переопределении структуры таблиц не возникает проблем. А для таблиц, не имеющих встроенных ключей можно при прилинковке задавать "свои" (в табличке описаний предусмотрено поле/поля), но это чревато странностями поведения при попытках вводить/редактировать/удалять записи с дублирующимися значениями псевдоключа.
...
Рейтинг: 0 / 0
AccessXP+SQLserver2000
    #32281753
2AN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. ключи по умолчанию для ODBC-линка НЕ находятся, только для mdb.
2. я не знаю как программно убить прилинкованную таблицу
3. спасибо за ссылки, но в них описано именно то, что я пользую. Трабл состоит в том, что при перелинковке таблиц из ODBC в mdb Access продолжает спрашивать DNS.
...
Рейтинг: 0 / 0
AccessXP+SQLserver2000
    #32281825
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если бы вы не поленились заглянуть в пример приложения, к которому отсылает страничка, вы б увидели в нем к примеру такие строчки:

Код: plaintext
1.
If IsTableExist(TargetTableName) =  2  Then dbCurrent.TableDefs.Delete TargetTableName
  If IsTableExist(TargetTableName) <>  0  Then GoTo AttachTableErr

В первой из которой табличный объект программно сносится, при условии своего наличия в семействе.

А все-таки она вертится(с) (ключи находятся. в Постгре - по крайней мере. Может быть это и не верно с мсскл, но это странно. Имеются в виду именно не индексы,а Primary Key). А на случай отсутствия, там (в примере) предлагались такие меры:
Код: plaintext
1.
2.
3.
4.
5.
6.
  If IsMissing(KeyFieldName) = False Then
    If (nz(KeyFieldName,  "") <> "  ") And (IsTableExist(TargetTableName) = 2 ) Then
      'Создадим псевдоиндекс - первичный ключ.
      dbCurrent.Execute "CREATE UNIQUE INDEX PrimaryKey ON  " _
       & TargetTableName & " ( " & KeyFieldName & " )"
    End If
  End If

(KeyFieldName - передаваемый опционально параметр "насильно навязываемого первичного ключа).
__
* примечание
IsTableExist - распространенного типа ф-я, в данном примере имеет вид:
Код: 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.
Function IsTableExist(TableName As String) As Long
' Функция возвращает следующие коды:
'  0  - Ни таблицы ни запроса с указанным именем не существует.
' 1 - Существует локальная таблица с указанным именем.
'  2  - Существует присоединённая таблица с указанным именем.
' 3 - Существует запрос с указанным именем.

On Error Resume Next
Dim db As Database
Dim td As TableDef
Dim qd As QueryDef

  IsTableExist = 0
  
  err.Clear
  Set db = CurrentDb
  Set td = db.TableDefs(TableName)
  If err.Number = 0 Then
    If td.Connect = "" Then 'Таблица локальная
      IsTableExist =  1 
    Else 'Таблица присоединенная
      IsTableExist = 2
    End If
    Set td = Nothing
    Set db = Nothing
    Exit Function
  End If
  
  err.Clear
  Set qd = db.QueryDefs(TableName)
  If err.Number = 0 Then IsTableExist = 3 'Запрос
  Set qd = Nothing
  Set db = Nothing
  
End Function

еще раз рекомендую присмотреться.
...
Рейтинг: 0 / 0
AccessXP+SQLserver2000
    #32282538
2AN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за совет "присмотреться" и терпение в объяснении.
Удалось добиться линкования таблиц через их удаление.

Таблицы, в которых есть PrimaryKey, редактируемы. Где Primary нет (а есть индекс по повторяющимся значениям) - только на чтение. Команда "create index" создаёт индекс (хотя он и существует в SQLserver), таблица начинает редактироваться, но работает это очень медленно (вместо 1 секунды - минуты 3), и неправильно сортирует другие поля.
SQLserver создавать индекс по полю не даёт, т.к. есть одинаковые значения. Создать поле GUID тоже не может - не заполняет, а ругается на Null.

Вообще-то мне надо просто редактировать таблицы, прилинкованные от SQLserver. Уже замонался с этим SQLserver. В Access таких заморочек просто нет, индексы - любые, связи - любые, обновления - любые, создание GUID - запросто. Всё, что хочешь и без проблем.
...
Рейтинг: 0 / 0
AccessXP+SQLserver2000
    #32282571
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это проблема именно Аксеса. (работы с внешними данными). "Создание индекса" создает не индекс в таблице SQL а некую параллельную структуру в аксесе (? точное расположение не знаю. гуру напомнят) и он уже пытается пользоваться ей, а не реальными индексами таблиц SQL. Поэтому если "задать" в качестве уникального "индекса " неуникальное значение, получишь заморочки. Если есть права на SQL - пополни таблицы PrimaryKey-ями, и не выеживайся. Если нет - попробуй отыскать действительно уникальную комбинацию полей.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / AccessXP+SQLserver2000
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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