2012-01-27 3 views
0

Я взял на себя поддержку приложения VB .Net, которое использует базу данных Access. Теперь я обнаружил, что разработчик, который написал это приложение, не создал никаких уникальных индексов в столбцах первичного ключа для таблиц в базе данных. Таким образом, ни один из полей первичного ключа не помечен как первичный ключ в доступе, и поэтому Access не выполняет двойную проверку. Кроме того, столбцы первичного ключа не будут автоматически увеличиваться с использованием типа AutoNumber в Access, а разработчик использовал такие запросы, чтобы вставлять строки в таблицы:Пакетное обновление базы данных Access (DDL). Возможное?

INSERT INTO Пользователи (pkid, FirstName, Surname, City) SELECT iif (isnull (max (pkid)), 0, max (pkid)) + 1, [@strFirstName], [@strSurname], [@strCity], FROM Users;

Это приложение, как правило, работает как сетевое приложение, в котором одновременно используется приложение до 40 человек, и в сочетании с проблемами проектирования, которые уже упоминались, это привело к серьезным проблемам параллелизма, когда нескольким пользователям присваивается одинаковое значение первичного ключа. Это == БОЛЬШАЯ ПРОБЛЕМА. :(

Теперь мне нужно разобраться в этом (угадайте, что я буду делать в эти выходные!). Я подумал, что, возможно, используя мьютекс вокруг кода, который вызывает запросы вставки Access, а не самый простой из решения, но это было бы самым быстрым. В конечном счете, хотя я бы хотел, чтобы база данных была скорректирована и имела правильные значения первичного ключа, но приложение в настоящее время работает примерно на 15 разных сайтах, поэтому мне нужно сделать какую-то партию обновление базы данных

Я не знаком с Access (это первый раз, когда я пользуюсь Access), извините, если это немного вопрос о нобе, но мне нужно решение быстро. Если я была ли эта проблема с базой данных Sybase или MSSql, с которой я знаком, я бы создал пакет SQL, который включал необходимые DDL-команды для исправления базы данных. Поэтому возникает вопрос: возможно ли в Access создать SQL-скрипт, который можно запустить из пакетного файла? Если нет, как я могу начать создавать «патч», который может быть выполнен на разных сайтах, которые будут обновлять соответствующие базы данных.

ответ

4

Вы можете легко запускать SQL в VBA, но я думаю, что было бы проще создать пустую базу данных Access с автоинкрементами вместо текущих столбцов идентификатора и добавить все ваши данные, потому что вы не можете изменить поле для автоматического автоматического создания он содержит любые данные.

+0

Спасибо, Remou. Я поеду по этому маршруту. – BruceHill

0

Доступ к базе данных на основе файлов, поэтому, если вы хотите отправлять обновления в DDL, вы отправляете новый .mdb.

+0

Это неправда. Microsoft Access поддерживает DDL-команды: [link] (http://msdn.microsoft.com/en-us/library/bb267262 (v = office.12) .aspx). Просто потому, что Microsoft Access является файловой основой, не имеет ничего общего с его поддержкой DDL. – codechurn

+0

Посмотрите мои примеры скриптонов Windows. Вам даже не нужно, чтобы Access был установлен в окне Windows, чтобы добавить столбец PK в соответствии с моим примером. –

+0

Да, я знаю, что он поддерживает команды DDL, но легче создать новый mdb так, как вы хотите, и разбить старый, чем отслеживать все изменения ddl и надеяться, что вы сделаете все правильно. Серверные базы данных различны: у вас нет возможности подключить новый db к электронной почте и заменить людей существующим файлом. – Beth

0

Собственно, вы можете использовать скрипты Windows. Введите следующее в блокнот, а затем сохраните его как ADDPK.vbs.

Set dbeng = CreateObject("DAO.DBEngine.120") 
strMdbFile = "C:\database53.accDB" 
Set db = dbeng.OpenDatabase(strMdbFile) 

strSql = "ALTER TABLE FAXBOOK add column ID COUNTER primary key" 
db.Execute strSql 

Затем из командной строки окна, вы идете:

C:\>c:\windows\syswow64\wscript.exe "c:\addpk.vbs" 

Вы должны использовать 32 битную версию здесь, так как я предполагаю, что 32-битный доступ.

Если вы используете предварительный доступ к 2010, а затем использовать:

Set dbeng = CreateObject("DAO.DBEngine.36") 
strMdbFile = "C:\database53.mdb" 
Set db = dbeng.OpenDatabase(strMdbFile) 
etc. 

Я использую окна, встроенные в VBS скриптов в выше, но вы можете использовать javascriting вместо выше (просто сохранить вышеуказанный файл как .js).

И если вы используете файлы mdb, то вышеуказанное даже работает на окнах без установленного программного обеспечения. Другими словами, в чистом окне windows xp будут выполняться указанные выше сценарии Windows, даже если не потребуется устанавливать Access.

Как уже отмечалось, для вышеуказанного примера JET? JET был установлен на windows по умолчанию с Windows 98SE, поэтому вышеупомянутый скрипт mdb будет работать даже в этих блоках. (даже при чистом девственном установлении будет запущен вышеприведенный скрипт).

Для более поздних изданий, и если вы используете файлы accDB, вам нужен механизм данных ACE. Это не инсталляция по умолчанию в окнах - вам нужно установить ее, или вы можете надеяться/предположить, что Access установлен. Двигатель можно установить как отдельную загрузку из Access, если хотите. И есть 64-битная версия.

Итак, в конце дня здесь вам не нужен Access, и вы можете использовать базовые сценарии Windows для обновления этих баз данных.

+1

Однако, как только столбец идентификатора будет добавлен в таблицу, уже содержащую данные, она будет заполнена номерами, которые вряд ли будут полезны для существующих отношений, тогда как добавление всего набора данных в пустую таблицу позволит пользователю заполнить автоинкрементная колонка с существующими уникальными числовыми идентификаторами. – Fionnuala

Смежные вопросы