Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Hello, World!
  
 

Фильтр по датам

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  16:57[Войти] | [Зарегистрироваться]

Опыт прикладного программиста в деле перевода базы данных с MS Access на SQL-Server

Светлов Виктор
дата публикации 02-07-2001 00:00

Опыт прикладного программиста в деле перевода базы данных с MS Access на SQL-Server

Здравствуйте, уважаемые коллеги.

Хочу поделиться недавним опытом перевода базы данных из формата Access 2000 на платформу MS SQL Server 7.0. Конечно, моя статья не отличается профессионализмом и полнотой изложения. Мой практический опыт работы с SQL-Server до этого момента был равен почти абсолютному нулю. Но как можно заметить, летом статей настолько мало, что искренне хочется поддержать наше Королевство.

Итак, приступим.
Несмотря на использование ODBC DSN и родных майкрософтовских драйверов обнаружилась некоторая несовместимость.
Используемые драйвера:
  • MS Access - "Microsoft Access Driver" из состава MS Office 2000
  • SQL-Server - "SQL Server" из состава MS SQL-Server 7.0
Операционная система сервера приложений - Windows 2000.

Весь перевод производился с помощью мастера "DTS Import Wizard", входящего в состав SQL-Server.

1. Перевод данных с датами

При переводе одной из таблиц обнаружились две ошибки:
  • Несмотря на запрет пустых значений для одного из полей в формате "дата-время", в таблице Access имелось 3 записи с пустыми значениями в этих полях. Всего записей в таблице более 17 тысяч. Как эти три там оказались - никто не знает.
  • После исправления этой ситуации процесс перевода был прерван ошибкой:
Как оказалось, в таблице имелась куча записей с годами вроде 2089, 2095, 2099. Причина этого понятна - использование маски при некорректной настройке формата даты в системе. Непонятно, почему эти данные не принял SQL-Server. Тем не менее, спасибо ему за это. Корректировке были подвергнуты более 3000 записей (программа не сопровождалась три года). Чтобы подобное не повторилось в дальнейшем, я поставил проверку на значение даты перед операцией "Post".

В дальнейшем перевод 24 таблиц прошел быстро и без затруднений. Объем базы данных в формате Access на момент перевода составлял 7.8 Мб после операции "сжатия-восстановления".

2. Особенность типов данных

По умолчанию в процессе перевода данных таблицы создавались с полями формата nvarchar и ntext. Как оказалось, при использовании майкрософтовского ODBC-драйвера "SQL Server" эти форматы не воспринимаются через BDE. Пришлось менять форматы на varchar и text. Varchar соответствует "текстовому" формату Access, а text - "полю Memo".

Также было замечено, что логические поля, приобретшие теперь тип "bit", не допускают использование пустых значений. Поэтому им необходимо указать значения по умолчанию (0 или -1).

После перевода все таблицы свободно открывались и редактировались через BDE. Как оказалось, индексы и реляционные связи не были конвертированы. Не желая испытывать судьбу, я тут же присвоил всем таблицам первичные индексы.

3. Некоторые особенности построения SQL-запросов

После перевода данных я занялся проверкой работоспособности программ. При этом обнаружилось следующее:
  • Использование условий вроде "= true" для логических полей порождало ошибку. Замена "true" на -1, а "false" на 0 решило проблему.
  • Использование в запросах условия "<> Null" оказалось недопустимым. Требуется писать "Is Not Null".
  • Условия на даты пришлось переписать в формате yyyymmdd в кавычках и без разделителей. При работе с Access использовалась маска #mm/dd/yyyy# с разделителем "/". Благодаря централизованному использованию функции преобразования даты в программе пришлось изменить только ее. Отсюда совет: используйте функции преобразования централизованно.
  • Последнее, с чем я столкнулся - это особенность работы функции Str() в запросе, которою я использовал для получения строкового значения логического поля. Access давал результат " -1" и " 0" для true и false соответственно. SQL-Server предложил " -1" и " 0" - уже с 10 пробелами перед значением. Это просто решается с помощью функции LTrim().
Вот и все! Затраченное на перевод время - 2,5 часа с тремя перекурами и одним перерывом на кофе. Несмотря на отсутствие вторичных индексов, выполнение запросов замедлилось не более, чем в два раза, а повторное открытие запроса - около полутора. Просто так лепить индексы мне не хочется, поэтому пока оставлю так, а как появится время, воспользуюсь утилитой "Query analyzer", который входит в состав SQL-Server. Как написано в умной книжке, она позволяет отслеживать этапы выполнения запроса по времени, из чего можно сделать вывод о необходимости тех или иных вторичных индексов.

Самое приятное, что сразу бросилось в глаза:
  • Быстрый backup и возможность архивации по расписанию. Установи два-три расписания с разными периодами и голова не болит. Недостаток: архивация возможна только на локальные носители. Подключенные сетевые диски и сетевые адреса не воспринимаются.
  • Исчезли проблемы с медленным сохранением Memo-полей, из-за чего запись блокировалась на значительное время.

В завершение несколько советов по использованию Access (опыт - четыре года):
  • Одни из лучших компонентов для доступа - фирмы Regatta Systems.
  • Тем не менее лучшим считаю вариант ODBC с драйвером MS Access 2000. Однако из-за проблем с Memo-полями, в частности, в больших таблицах, приходилось использовать отдельные запросы на их изменение.
  • При настройке DSN установите параметр "Safe transaction" равным 1. По умолчанию 0. Из справки: "Если имеет значение 0 (по умолчанию), все транзакции передаются немедленно. Если имеет значение 1, все транзакции сохраняются на диске только после операции передачи. При этом немного снижается быстродействие."
  • Наибольшая скорость работы с базой данных (практически мгновенно) была получена на операционной системе Windows 2000.

На этом желаю всем приятной работы. И пожалуйста, особо не критикуйте статью: во-первых, это моя первая статья в Королевство, а во-вторых, написана она была исключительно для того, чтобы не видеть каждый день аннотацию, что последняя статья была в королевстве две недели назад :)

Виктор Светлов. (Пока без титула - простой крестьянин.)
02 июля 2001г.




Смотрите также материалы по темам:
[MS SQL Server] [MS Access] [Импорт/экспорт данных]

 Обсуждение материала [ 15-03-2005 06:22 ] 25 сообщений
  
Время на сайте: GMT минус 5 часов

Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.

Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

 
© При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
Все используемые на сайте торговые марки являются собственностью их производителей.

Яндекс цитирования