Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с базой данных аксесса из вторичного потока, Пожалуста задайте мне направление поиска 
:(
    Опции темы
jigagun
  Дата 21.1.2010, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 17.1.2010

Репутация: нет
Всего: нет



Имеется база данных на аксессе, программа (пишется в Delphi 7).

В программе имеем 4-ре модуля: 1 - основной формы (Готовый), 2 - data source (готовый на основе ADO), 3 - отдельный поток по работе с gsm модемом (В разработке), обработка приходящих смс и запись их в базу данных, 4 - отдельный поток ftp-server (В стадии обдумывания).

В главной форме отображены 3-и таблицы базы данных - только просмотр через ADOTable и тому подобное.

Ну вроде все кратко описал.

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

Если кто-то может предоставить пример, буду весьма признателен.

Это сообщение отредактировал(а) jigagun - 21.1.2010, 18:44
PM MAIL   Вверх
~FoX~
Дата 21.1.2010, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 4
Всего: 68



jigagun, Тут все зависит от вопроса... Тебе нужно, по ФТП, СМС получить запрос.... или по этим же протоколам отправить результат?
Если только отправить/принять запрос, то постоянно висящий сервер, и клиенты которые отправляю ему какой нить пакет/меседж/... Если надо что то возвращать, то - ни ФТП, ни тем более СМС не предполагают работу с БД...для ФТП вполне можно получить запрос в виде строки и отправить сформированы *.ord. Для СМС, конечно это не реально....


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
jigagun
Дата 21.1.2010, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 17.1.2010

Репутация: нет
Всего: нет



~FoX~

Это программа диспетчерского пульта. По СМС и ФТП я получаю сообщения определенного формата, обрабатываю их и записываю в базу данных.

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

Как-то вот так.... криво наверное излагаю свои мысли от недостатка опыта!!!
PM MAIL   Вверх
~FoX~
Дата 21.1.2010, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 4
Всего: 68



Цитата(jigagun @  21.1.2010,  20:38 Найти цитируемый пост)
SQL запрос на поиск который будет возвращать данные не через DBTable,

Я после работы сильно туплю... НО, запрос возвращает рекордсет, а DBTable, это всего лишь средство отображения....


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Демо
Дата 21.1.2010, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 2
Всего: 50



Цитата(~FoX~ @  21.1.2010,  19:49 Найти цитируемый пост)
а DBTable, это всего лишь средство отображения....

Не-а. Это не средство отображения. Для отображения TDBGrid ;)
Это тоже наследник TDataset.

Добавлено через 2 минуты и 22 секунды
Цитата(jigagun @  21.1.2010,  18:43 Найти цитируемый пост)
Вопрос задайте направления моим мыслям, чем пользоваться для организации запросов на поиск и изменение базы данных из не визуальных потоков смс и фтп.


Так вроде бы реализуй запросы в TThread, да и всё.
Не должно возникнуть проблем.


--------------------
    
PM MAIL ICQ Skype   Вверх
jigagun
Дата 22.1.2010, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 17.1.2010

Репутация: нет
Всего: нет



Цитата(Демо @ 21.1.2010,  21:37)
Цитата(~FoX~ @  21.1.2010,  19:49 Найти цитируемый пост)
а DBTable, это всего лишь средство отображения....

Не-а. Это не средство отображения. Для отображения TDBGrid ;)
Это тоже наследник TDataset.

Добавлено @ 21:39
Цитата(jigagun @  21.1.2010,  18:43 Найти цитируемый пост)
Вопрос задайте направления моим мыслям, чем пользоваться для организации запросов на поиск и изменение базы данных из не визуальных потоков смс и фтп.


Так вроде бы реализуй запросы в TThread, да и всё.
Не должно возникнуть проблем.

Видимо в силу своей неопытности, у меня не получается четко сформулировать вопрос. Попробую подробнее описать программу.


Программа состоит из 3-ёх потоков:

1. Главный - интерфейсный поток, где юзверь делает свои дела.
    в наличии 3 - TDBGrid в которых отображается информация из трех таблиц базы данных через DataModule

2. SMS поток (на базе TThread) - где проводиться через ком-порт запрос в джиэсем модем на получение смс -> далее смс разбивается по шаблону и должна вноситься в базу данных

3. FTP поток (на базе TThread) - то же самое что и в предыдушем только с txt файлами.

так же имеется DataModule в состав которого входит:
  ADOConnection - 1 штука
  TADOTable связанная с DataSource - 3 штуки для каждой таблицы, которые отображаются на главной форме
  TADOQuery + DataSource - для организации SQL запросов.

Вопрос в следующем: для проверки смс на ликвидность я должен сверить номер телефона с которого она пришла с номерами телефонов которые в базе данных.  TADOQuery + DataSource - эта связка на сколько я понял работает только с визуальными компонентами. В поток SMS мне не удалось запихать TDBGrid, а делать на главной форме невидимую таблицу и дрючить её из потока неохота из-за гемора с синхронизацией. Вот и вопрос как организовать правильно запрос из потока?

P.s. возможно решение очень простое, но мой малый опыт работы с базами данных (примерно последние 2-ве недели) еще слишком мал. Поэтому прошу подскажите как правильно использовать, то что я напихал или чем это заменить. А желательно ткните меня носом в ссылку на доходчиный FAQ или пример.



PM MAIL   Вверх
Демо
Дата 22.1.2010, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 2
Всего: 50



Цитата(jigagun @  22.1.2010,  01:51 Найти цитируемый пост)
  TADOTable связанная с DataSource - 3 штуки для каждой таблицы, которые отображаются на главной форме



Для чего используется отображение данных? Каким образом? В какой момент это происходит по отношению к получению данных?
Логику и причину использования TDBGrid и TADOTable уловить пока не могу.

Данные видеть нужно? В какой момент? - Во время получения?


--------------------
    
PM MAIL ICQ Skype   Вверх
jigagun
Дата 22.1.2010, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 17.1.2010

Репутация: нет
Всего: нет



Цитата(Демо @ 22.1.2010,  11:46)
Цитата(jigagun @  22.1.2010,  01:51 Найти цитируемый пост)
  TADOTable связанная с DataSource - 3 штуки для каждой таблицы, которые отображаются на главной форме



Для чего используется отображение данных? Каким образом? В какой момент это происходит по отношению к получению данных?
Логику и причину использования TDBGrid и TADOTable уловить пока не могу.

Данные видеть нужно? В какой момент? - Во время получения?

Логика проста, с начала рассмотрения данной части программы использовал литературу "Библия для программиста в среде Delphi"(автор Флеонов), там именно так строиться работа с базой данных через ADO. 


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


Привожу часть использованной книги где рассмотрен пример на котором я основывался.

Это сообщение отредактировал(а) jigagun - 22.1.2010, 12:49

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  1.rar 857,90 Kb
PM MAIL   Вверх
Демо
Дата 22.1.2010, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 2
Всего: 50



jigagun, 
Для твоей задачи решение совсем простое - данные получаешь в дополнительных потоках и заполняешь таблицы (используй TADOQuery для обновления таблиц), а в основном потоке используешь TADOQuery уже для отображения (TAdoQuery+TDataSource+TDBGrid).
TADOConnection можно использовать один для всех запросов, но проще на каждый поток свой.


--------------------
    
PM MAIL ICQ Skype   Вверх
jigagun
Дата 22.1.2010, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 17.1.2010

Репутация: нет
Всего: нет



Цитата(Демо @ 22.1.2010,  15:23)
jigagun, 
Для твоей задачи решение совсем простое - данные получаешь в дополнительных потоках и заполняешь таблицы (используй TADOQuery для обновления таблиц), а в основном потоке используешь TADOQuery уже для отображения (TAdoQuery+TDataSource+TDBGrid).
TADOConnection можно использовать один для всех запросов, но проще на каждый поток свой.


прежде чем сделать изменение в базе мне надо удостовериться, что номер с которого пришла смс есть в базе!!!
Да это я и так уже делаю. Основная проблема я делаю запрос на поиск номера телефона в базе данных, возврат результата поиска, я лично из собственных скудных знаний могу сделать только в TDBGrid связав его с TADOQuery через TDataSource - т.е. добраться для сравнения я могу только через визуальный компонент - ВОТ ТУТ ПРОБЛЕМА как мне узнать результат запроса не используя визуальных компонентов, так как запихать в поток я их не могу а ставить на главную форму и мучиться с синхронизацией ПРОСТО Ж**А КАК НЕОХОТА.

Это сообщение отредактировал(а) jigagun - 22.1.2010, 16:04
PM MAIL   Вверх
Демо
Дата 23.1.2010, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 2
Всего: 50



Цитата(jigagun @  22.1.2010,  16:03 Найти цитируемый пост)
прежде чем сделать изменение в базе мне надо удостовериться, что номер с которого пришла смс есть в базе!!!


Так ты что-ли вручную проверку делаешь?

Ты бы логику коротко описал - действия шаг за шагом что тебе необходимо получить, какие шаги в программе.

А то всё-таки непонятно в чём проблема.
Давно бы уже посоветовали и решили, если бы ясно всё было.


--------------------
    
PM MAIL ICQ Skype   Вверх
jigagun
Дата 23.1.2010, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 17.1.2010

Репутация: нет
Всего: нет



Цитата(Демо @ 23.1.2010,  00:57)
Цитата(jigagun @  22.1.2010,  16:03 Найти цитируемый пост)
прежде чем сделать изменение в базе мне надо удостовериться, что номер с которого пришла смс есть в базе!!!


Так ты что-ли вручную проверку делаешь?

Ты бы логику коротко описал - действия шаг за шагом что тебе необходимо получить, какие шаги в программе.

А то всё-таки непонятно в чём проблема.
Давно бы уже посоветовали и решили, если бы ясно всё было.

короче просто помоги составить запрос к таблице так что бы он возвращал результат поиска в каком либо не визуальном виде, типа таблица в которой 3 столбца
№тел | imei | фамилия 


делаем запрос на сверку существует ли номер в таблице. Самое главное получение результата поиска True - есть, False - нет или сам номер телефона или значение nil(null)
PM MAIL   Вверх
Демо
Дата 23.1.2010, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 2
Всего: 50



Ну вот небольшой пример из реальной программы:

Код

type

  function GetAQ: TAdoQuery;
  procedure FreeAQ(AQ: TADOQuery);
  function CreateForm(const Msg: AnsiString; Params: TParamStr;
    FieldWidth: Integer=100): TForm;
  function DeleteRecord(const Phone: AnsiString): Boolean; overload;
  function DeleteRecord(const PhoneId: Integer): Boolean; overload;


Код

function GetAC: TADOConnection;
begin
  Result := fMain.ADC;
end;

procedure FreeAQ(AQ: TADOQuery);
begin
  if not Assigned(AQ) then Exit;
  try
    AQ.Close;
  except
  end;
  AQ.Free;
end;

function GetAQ: TAdoQuery;
var
  AC: TAdoConnection;
begin
  Result := nil;
  AC := GetAC;
  if AC=nil then Exit;
  Result := TADOQuery.Create(nil);
  Result.Connection := AC;
end;

Код

function DeleteRecord(const PhoneId: Integer): Boolean;
var
  AQ: TADOQuery;
begin
  Result := False;
  AQ := GetAQ;
  AQ.Connection.BeginTrans;
  try
    try
      AQ.SQL.Text := 'DELETE FROM Phone WHERE id=:pPhoneId';
      AQ.Parameters.ParseSQL(AQ.SQL.Text,True);
      AQ.Parameters.ParamValues['pPhoneId'] := PhoneId;
      AQ.ExecSQL;

      AQ.SQL.Text := 'DELETE FROM PhoneOld WHERE PhoneId=:pPhoneId';
      AQ.Parameters.ParseSQL(AQ.SQL.Text,True);
      AQ.Parameters.ParamValues['pPhoneId'] := PhoneId;
      AQ.ExecSQL;

      AQ.Connection.CommitTrans;
      Result := True;
    except
      AQ.Connection.RollbackTrans;
    end;
  finally
    FreeAQ(AQ);
  end;
end;


Код

function DeleteRecord(const Phone: AnsiString): Boolean;
var
  AQ: TADOQuery;
  PhoneId: Integer;
  s: AnsiString;
begin
  Result := False;
  AQ := GetAQ;
  s := Phone;
  try
    AQ.SQL.Text := 'SELECT * FROM Phone WHERE Phone=:pPhone';
    AQ.Parameters.ParseSQL(AQ.SQL.Text,True);
    AQ.Parameters.ParamValues['pPhone'] := s;
    AQ.Open;
    if not AQ.IsEmpty then
    begin
      PhoneId := AQ.FieldValues['id'];
      AQ.Close;
      Result := DeleteRecord(PhoneId);
    end;
//    else ShowMessage(IntToStr(AQ.RecordCount)+'/'+s);
  finally
    FreeAQ(AQ);
  end;
end;



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




--------------------
    
PM MAIL ICQ Skype   Вверх
jigagun
Дата 23.1.2010, 02:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 17.1.2010

Репутация: нет
Всего: нет



Огромное спасибо... вот именно то, что я искал!!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

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


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0979 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.