Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.02.2014, 23:46
Кодер Кодер вне форума
Активный
 
Регистрация: 25.02.2008
Сообщения: 395
Репутация: -599
По умолчанию Знания, опыт на шару

Уважаемые,

имеется программа , работающая с БД MS Access 2003. Все дело лежит на сетевом диске, откуда пользователи собственно и "кушают".

Для того, чтобы обновить программу приходилось убивать процессы у всех пользователей от админа на уровне домена (чьими правами обладает лишь ведущий сис.адм.), и ручками заменять файлы на сетевом диске.

Далее реализовал следующее: Если в корне папки с программой создавался файл "upd", то программа закрывалась, а следом запускала рядом лежащий updater.exe (тупоформа с постоянно крутящемся прогрессбаром), который не давал пользователям запустить основную программу, пока существует сие файл "upd".

Однако не всегда такая реализация срабатывает, скорее всего от неккоректного завершения программы. Что создавало проблему - при замены файлов ручками выдавало сообщение "Невозможно скопировать..используется другим пользователем".

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

Делаю так:

Код:
q := TAdoQuery.Create(nil);
...
SQL.Text :='SELECT * FROM [%TABLENAME%] WHERE [FIELD1] LIKE :param1 ... ... [FIELD N] LIKE :paramN';
q.parameters.parambyname('param1').value := S;
..
q.parameters.parambyname('paramN').value := S;

Есть ли более гуманный способ? (Использование одного параметра в запросе выдавало некорректный ответ, пришлось использовать свой параметр для каждого поля)

Что Вы посоветуете мне в моей ситуации? Рассмотрю любые предложения.
Ответить с цитированием
  #2  
Старый 18.02.2014, 00:04
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Оффтоп:
Для начала смените свою подпись, не позорьте коллектив - ссыль уберите, нарушение ПФ пункт 2.6

А идея с управляющим временным файлом в корне, это отличная лазейка для всяких разных вредоносных "полезняшек" однако...
Ответить с цитированием
  #3  
Старый 18.02.2014, 00:21
Кодер Кодер вне форума
Активный
 
Регистрация: 25.02.2008
Сообщения: 395
Репутация: -599
По умолчанию

На создание файлов в данной директории имеют права только 3 человека, поэтому не могу сказать, что это будет проблема.
Ответить с цитированием
  #4  
Старый 18.02.2014, 00:25
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Тогда это в корне меняет ситуацию - а как происходит "неккоректное завершение программы" у клиента, может здесь корень? Хотя бы в общих чертах, пжлст
Ответить с цитированием
  #5  
Старый 18.02.2014, 00:37
Кодер Кодер вне форума
Активный
 
Регистрация: 25.02.2008
Сообщения: 395
Репутация: -599
По умолчанию

Не могу сказать потому как отследить нет возможности. Процесс остается висеть и мешает всему процессу обновления.
Ответить с цитированием
  #6  
Старый 18.02.2014, 00:44
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Ведь вроде если получится правильно убивать приложения пользователей,первая проблема исчезнет, правильно? Я так понимаю логику - прога у пользователя следит за корнем СД, и если там есть маячок "upd" то она себя грохает. Проблем быть не должно в этом месте, странно
Ответить с цитированием
  #7  
Старый 18.02.2014, 08:01
Кодер Кодер вне форума
Активный
 
Регистрация: 25.02.2008
Сообщения: 395
Репутация: -599
По умолчанию

А вот почему-то все происходит именно так как мы не ждем. Чуть позже выложу код завершения программы, быть может там что не так.
Ответить с цитированием
  #8  
Старый 18.02.2014, 21:46
Кодер Кодер вне форума
Активный
 
Регистрация: 25.02.2008
Сообщения: 395
Репутация: -599
По умолчанию

Возможно проблема нашлась. Было дело переделывал некоторые моменты программы, заменив компонент ADOconnection на создаваемый динамически, и видимо в спешке забыл отключать соединение с бд при завершении. Завтра проверю.

Невнимательность всегда меня наказывала.
Ответить с цитированием
  #9  
Старый 19.02.2014, 06:24
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

По первому вопросу, можно просто сделать запускач, который копирует файл с сетевого диска на локальный и запускает уже локальную копию. Далее уже сама программа следит за файлом-флагом (например, можно туда класть версию или вообще ее читать с оригинального файла) и если файл на шаре новее, то выдавать сообщение, что надо перезапустить программу.

По второму вопросу. Ну сконкатенируй все поля в одну строку и уже на нее "натрви" LIKE:
Код:
SELECT * FROM [%TABLENAME%] WHERE [FIELD1] || [FIELD2] || ... || [FIELDN] LIKE :param1
Для полной уверенности можно их объединить через символ, которого в строке поиска быть не может, например, ~
[code]
[FIELD1] || '~' || [FIELD2] || '~' || ... || '~' || [FIELDN]
[code]
Ответить с цитированием
  #10  
Старый 19.02.2014, 14:31
Кодер Кодер вне форума
Активный
 
Регистрация: 25.02.2008
Сообщения: 395
Репутация: -599
По умолчанию

Цитата:
Возможно проблема нашлась. Было дело переделывал некоторые моменты программы, заменив компонент ADOconnection на создаваемый динамически, и видимо в спешке забыл отключать соединение с бд при завершении. Завтра проверю.

Проверил - ниочем. Заметил, что файл *.ldb не удаляется после закрытия сессии у всех пользователей. Могу предположить, что это связано с недавним крахом БД. Как решить проблему (удалить файл *.ldb)?

lmikle, , при использовании || в запросе, ругается, что нельзя использовать эти символы. Запрос след. вида:

Код:
SELECT * FROM [%TABLENAME%] WHERE UCASE([FIELD1]) || UCASE([FIELD2]) || ... || UCASE([FIELDN]) LIKE :param1

И подскажите, чем отличается
Код:
TAdoQuery.MoveBy(Value)
от
Код:
TAdoQuery.BlockReadNext
Ответить с цитированием
  #11  
Старый 19.02.2014, 18:03
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Кодер
lmikle, , при использовании || в запросе, ругается, что нельзя использовать эти символы. Запрос след. вида:

Код:
SELECT * FROM [%TABLENAME%] WHERE UCASE([FIELD1]) || UCASE([FIELD2]) || ... || UCASE([FIELDN]) LIKE :param1

Ой, забыл, что Access. Там, вроде, + надо использовать для сложения строк... посмотри доку. Главное, смысл понятен.
Ответить с цитированием
  #12  
Старый 20.02.2014, 18:28
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Кодер
...Заметил, что файл *.ldb не удаляется после закрытия сессии у всех пользователей. Могу предположить, что это связано с недавним крахом БД. Как решить проблему (удалить файл *.ldb)?..
Правильное предположение, это джетовская времянка, его наличие говорит о подключении к драйверу Access т.е. перед экстренным закрытием клиентского приложения в CloseQuery нужно выполнять что-то типа Session.Close, тогда всё будет нормально завершаться. Мне его разблокированным удалось получить лишь радикальным способом - во время работы БД вытащил батарейку из нубука, и он исчез после повторного подключения и последующего выхода из проги. Если не удаляется, значит есть коннект к движку, нужно грохать сам процесс
Ответить с цитированием
  #13  
Старый 20.02.2014, 23:56
Кодер Кодер вне форума
Активный
 
Регистрация: 25.02.2008
Сообщения: 395
Репутация: -599
По умолчанию

Цитата:
Если не удаляется, значит есть коннект к движку, нужно грохать сам процесс
у меня онлайн в 70 пользователей на борту. После краха БД,убили процесс у всех users, однако файл еще висел.
Проблему можно решить подключившись к другой БД (можно просто переименовать старую)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:49.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter