2009-05-01 6 views
1

У меня есть программа базы данных, которая использует MS Access. Пришло время, и мне нужно сделать его клиент-серверным приложением. Идея схемы заключается в следующем: сервер хранит базу данных, и один или несколько клиентов должны получить к ней доступ одновременно. Программе по-прежнему необходимо будет работать под управлением Ms Access (поскольку для переноса DB и перезаписи приложения не может быть и речи).Delphi - База данных ODBC сети (MS Access)

Еще одна схема, которая, честно говоря, мне не очень нравится, заключается в том, чтобы клиенты запросили файл БД с сервера, передали его через локальную сеть и получили доступ к нему локально ... но клиенты могут вносить в него изменения, неэффективен.

Теперь мой вопрос: что является правильным способом реализации этого. И как получить доступ к сетевой базе данных? Сделайте его общим, или есть какой-либо способ использования Indy и т. Д.

+1

Я прочитал все ответы и до сих пор не понимаю ваш вопрос. Некоторые из ответов предполагают, что вы используете Access как интерфейс, а затем поднимаете вопрос о том, что делает Delphi в миксе. Я думаю, вы имеете в виду, что используете Jet MDB, а Access не задействован ни на одном уровне, и когда вы говорите: «Программа все равно должна работать под Ms Access (потому что портирование БД и переписывание приложения не может быть и речи) «вы имеете в виду, что вам нужно использовать заднюю часть производства Jet при разработке нового приложения, которое использует серверный конец. Но мне совершенно не ясно, каков ваш сценарий. –

+0

Приложение Delphi управляет базой данных. Он использует стандартные компоненты ADO для Delphi для доступа к базе данных MDB. До сих пор база данных хранилась локально. Теперь приложение должно находиться на другом ПК, и оно будет по-прежнему использоваться для управления БД, однако другие клиенты должны подключиться к нему, а также изменить базу данных (не так много). И вопрос был «Каков правильный способ сделать это». Переписывающая часть означает, что перенос ее в систему БД, несовместимую с ADO, не является допустимым решением. – zz1433

ответ

1

Для совместного доступа к базе данных, просто поместите * .mdb файл в сеть поделиться и открыть его по сети. Я использую эту технику для примерно 15 пользователей сети, выходя за пределы этого или в местах с большим количеством трафика, я нажимаю на SQL Server.

Перенос на SQLServer - очень простая задача, особенно если вы используете компоненты dbGO (ADO), поскольку все, что потребуется, это изменение строки подключения для указания экземпляра SQL Server. Единственная проблема, с которой я столкнулась с таким преобразованием, - это логические поля. При доступе эти поля имеют внутреннее представление 0 или -1, а в SQL Server они имеют внутреннее представление 0 или 1. В Access они разрешаются как логические, в SQL Server этого нет. Например следующий запрос не в SQL Server:

SELECT * FROM TABLE WHERE BOOLFIELD 

она должна быть переписана в виде:

SELECT * FROM TABLE WHERE BOOLFIELD <> 0 

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

Процесс преобразования довольно прост. Используйте средство миграции для переноса базы данных доступа на SQL Server, а затем используйте базу данных сценариев SQL Server для создания сценария для вас. Либо предоставите этот сценарий своим клиентам для развертывания, сделайте это самостоятельно в каждом месте, либо напишите программу для синтаксического анализа и выполнения каждой команды, как считанной из файла.

Вы можете перенести данные из одной базы данных в другую через SQLServer с помощью метода OpenDataSource, а затем выполнить вставку из вашей базы данных доступа.

INSERT INTO TABLE FROM 
    OpenDataSource('Microsoft.Jet.OLEDB.4.0','Access.mdb')...TABLE 

Другой вариант - перейти на n-Tier. Если у вас есть корпоративная версия Delphi, то ее не сложно перенести систему на истинное решение n-уровня с помощью TClientDatasets и написать несколько серверных функций. Конечно, пробег будет сильно зависеть от текущей компоновки вашего приложения и от того, насколько сложна система.

+0

Спасибо за ответ, я попробую сетевую версию. Поскольку клиенты не получают большого трафика на сервер, им нужно будет вставить строку в таблицу, изменить несколько существующих строк и, конечно, материал запроса из 3 таблиц, которые, кстати, три из них были суммированы в 99% случаев не будут иметь более 150 строк. Если это не удается, я сильно рассмотрю MSSQL. – zz1433

+0

Также существует ограничение на доступ к клиенту с Access. вы можете иметь только 255 подключений к базе данных, на самом деле я не рекомендую своим клиентам использовать Access для более чем 20 пользователей, но это мое приложение ... вы могли бы уйти от большего количества. – skamradt

+0

Обычно будет один подключенный клиент, редко 2 или 3. Поэтому я думаю, что 255 соединений в порядке. Но я уже начал возиться с MS SQL с возможным обновлением в будущем. – zz1433

0

Почему для переноса БД обязательно требуется переписывание приложения?

Как насчет использования SQL Server Migration Assistant для переноса базы данных MS Access на SQL Server?

1

Базы данных на основе файлов, такие как Access, по сути являются однопользовательскими. Вы можете поделиться ими, но вы открываете себе мир коррумпированных баз данных и боли. Если у вас многопользовательское приложение, вам нужна многопользовательская серверная база данных.

+0

Совершенно неправильно. Базы данных доступа по своей сути являются многопользовательскими - они встроены в основу Jet. Если вы точно знаете, что вы делаете для распределения частей приложения и данных, это будет очень безопасно и надежно для небольшой группы пользователей рабочей группы (около 25 пользователей), и если вы хорошо напишете свое приложение, то до 100 пользователи. –

+0

Как кто-то, кто знает, что она делает, и не совсем является новичком SQL, приложения Access, с которыми я работал, стали неустойчивыми после 10 одновременных пользователей, непригодными для использования после 20 одновременных пользователей. Нет разумного способа обслуживать базу данных Access до 100 пользователей, если вы не можете гарантировать, что очень немногие подключены сразу, или вы используете сопоставленные таблицы, указывающие на лучшую систему базы данных. – Juliet

+1

@ David-W-Fenton: постарайтесь не быть таким фанатом Access. У него есть свое место, но с большим количеством пользователей он не является надежным. В качестве интерфейса для, скажем, SQL Server, это полезно. Это формат файла, а не движок в смысле «отправить запрос, получить результаты». Данные копируются локально, блокировки остаются в сети и т. Д. Вытаскивание вилки из клиентского ПК может привести к повреждению сетевой копии. Вы не можете надежно поддержать его. и т. д. и т. д. – gbn

1

Если вы используете базу данных с контроллером ODBC Delphi, вам не нужно беспокоиться о портировании AP и DB (ну, может быть, некоторые незначительные проблемы для исправления). ODBC делает все БД с использованием одного и того же интерфейса, поэтому вы можете просто изменить строку подключения источника данных (DSN) на удаленный сервер с помощью acc/pw для входа в систему, а затем все должно работать. Кроме того, он может работать нормально, даже если вы измените Access на другую систему ODBC, например MySQL, с несколькими незначительными изменениями SQL-команд.

Так что вернемся к вашему вопросу. Использование файла на сервере будет определенным сбоем, если ваш пользователь вырастет больше, чем, ну, 2. При одновременном доступе к базе данных с несколькими пользователями вам потребуется транзакционное (или атомное) поведение на стороне БД, чего не хватает в Access. Это может сделать только настоящий сервер DB, такой как MySQL или MSSQL или Oracle/DB2/....

Не используйте общий файл базы данных. Используйте настоящий сервер базы данных, если только у вас нет только одного клиента.

0

Мое решение: используйте что-то вроде RemObjects SDK для определения интерфейса, который приложения вызывают для получения данных из базы данных. У вас, вероятно, есть датамодуль или что-то, что уже определяет необходимые вызовы, но это может помочь привести в порядок ваше приложение. Затем вы можете получить доступ к данным удаленно с помощью своего приложения и получить доступ к базе данных Access. Когда это подходит, вы можете перенести данные на что-то еще и не менять клиентов, поскольку они теперь используют интерфейс и не заботятся о реализации.

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

0

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

0

Я проверял сервер MSSQL, и как в 2005, так и в 2008 году для работы платформы .NET потребовалась. Какие другие системы баз данных, которые совместимы с ADO, доступны (не основаны на файлах)

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