Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.07.2011, 14:21   #1
MyIE
Форумчанин
 
Аватар для MyIE
 
Регистрация: 02.01.2010
Сообщений: 127
По умолчанию Оишбка в потоке при работе с ADO

Текст потока:
Код:
unit ThreadStream_status;

interface

uses
  Classes, ADODB, DB, idhttp;

type
  StreamStatus = class(TThread)
    ADOC1: TADOConnection;
    Streams: TADOTable;
    Streamsid: TAutoIncField;
    StreamsDS: TDataSource;
    ADOQ1: TADOQuery;
    idhttp1: TIdHTTP;
    procedure SetSettings;
    procedure CheckStatus(service: integer; id: string);
    procedure SetStatus(status, id: string);
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

implementation

uses UnitMain;

{ StreamStatus }

procedure StreamStatus.SetSettings;
begin
  ADOC1 := TADOConnection.Create(nil);
  Streams := TADOTable.Create(nil);
  StreamsDS := TDataSource.Create(nil);
  ADOQ1 := TADOQuery.Create(nil);
  // ADOConnection 
  ADOC1.ConnectionString :=
    'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=D:\Programming\delphi_2010\__sc2stream\db.mdb;';
  ADOC1.ConnectionString := ADOC1.ConnectionString +
    'Mode=Share Deny None;Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";';
  ADOC1.ConnectionString := ADOC1.ConnectionString +
    'Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;';
  ADOC1.ConnectionString := ADOC1.ConnectionString +
    'Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don''t Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;';
  ADOC1.LoginPrompt := false;
  ADOC1.Mode := cmShareDenyNone;
  ADOC1.Provider := 'Microsoft.Jet.OLEDB.4.0';
  ADOC1.Connected := true;
  // ADOTable 
  Streams.Connection := ADOC1;
  Streams.CursorType := ctStatic;
  Streams.IndexName := 'PrimaryKey';
  Streams.TableName := 'Streams';
  // DataSource 
  StreamsDS.DataSet := Streams;
  StreamsDS.DataSet.Open;
  StreamsDS.Enabled := true;
  // ADOQuery 
  ADOQ1.Connection := ADOC1;
  ADOQ1.DataSource := StreamsDS;
end;

procedure StreamStatus.CheckStatus(service: integer; id: string);
var
  html: string;
begin
  idhttp1 := TIdHTTP.Create(nil);
  idhttp1.ReadTimeout := 3000;
  case service of
    1: // own3d 
      begin
        html := idhttp1.Get
          ('http://static.ec.own3d.tv/live_tmp/' + id + '.txt');
        if html = 'liveViewers=0&liveStatus=false&liveVerified=1' then
          SetStatus('off', id)
        else
          SetStatus('on', id);
      end;
    2: // justin 
      begin
        html := idhttp1.Get
          ('http://api.justin.tv/api/stream/search/' + id + '.json');
        if length(html) < 5 then
          // SetStatus('off', id) 
        else
          // SetStatus('on', id); 
        end;
      end;
  end;

  procedure StreamStatus.SetStatus(status, id: string);
  begin
    ADOQ1.SQL.Clear;
    ADOQ1.SQL.Add('UPDATE streams SET status = ''' + status +
        ''' WHERE stream_id = ''' + id + ''' ');
    ADOQ1.ExecSQL;
  end;

  procedure StreamStatus.Execute;

  var
    i, count, service: integer;
    stream_id: string;
  begin
    // Установка настроек 
    SetSettings;
    // Получаем число записей 
    count := 6;
    { Place thread code here }
    ADOQ1.SQL.Clear;
    ADOQ1.SQL.Add('SELECT * FROM streams');
    ADOQ1.Open;
    Streams.Open;
    for i := 1 to 1 do
    begin
      service := ADOQ1.Fields[3].AsInteger;
      stream_id := ADOQ1.Fields[9].AsString;
      CheckStatus(service, stream_id);
      ADOQ1.Open;
      //Streams.Open;
      ADOQ1.Next;
    end;
  end;

end.
Ошибка:
PHP код:
Текущий поставщик не поддерживает возврат нескольких наборов записей в одной операции 
Если закомментировать строку "ADOQ1.Next", то проблем нет. только вот мне надо по-очереди получать данные каждой записи.

Как исправить проблему? Может нужно более позднюю версия access файла использовать? Может более поздняя версия поддерживает возврат нескольких записей?
0_o

Последний раз редактировалось Stilet; 07.10.2015 в 12:09.
MyIE вне форума Ответить с цитированием
Старый 07.07.2011, 14:55   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Попробуй заменить
Код:
    for i := 1 to 1 do 
    begin 
      service := ADOQ1.Fields[3].AsInteger; 
      stream_id := ADOQ1.Fields[9].AsString; 
      CheckStatus(service, stream_id); 
      ADOQ1.Open; 
      //Streams.Open; 
      ADOQ1.Next; 
    end;
на
Код:
    while not ADOQ1.Eof do begin
      service := ADOQ1.Fields[3].AsInteger; 
      stream_id := ADOQ1.Fields[9].AsString; 
      CheckStatus(service, stream_id); 
      ADOQ1.Next; 
    end;
И не понятно зачем StreamsDS вообще нужно
Хотя SetStatus закроет ADOQ1. В нем нужно другой ADOQuery использовать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 07.07.2011 в 15:04.
Аватар вне форума Ответить с цитированием
Старый 07.07.2011, 17:50   #3
MyIE
Форумчанин
 
Аватар для MyIE
 
Регистрация: 02.01.2010
Сообщений: 127
По умолчанию

Ну во-первых: без
Код:
ADOQ1.Open;
Ошибка грит, что DataSet закрыт.

А во-вторых: с данной строчкой:
Код:
while not ADOQ1.Eof do begin
      service := ADOQ1.Fields[3].AsInteger; 
      stream_id := ADOQ1.Fields[9].AsString; 
      CheckStatus(service, stream_id); 
      ADOQ1.Open;
      ADOQ1.Next; 
    end;
та же ошибка и далее еще одна вылазит:
Код:
CommandText does not return a result set
StreamDS наверное действительно не нужен, просто он у меня есть в части программы, где используется DBGrid, но он в данном потоке погоды не делает.
0_o
MyIE вне форума Ответить с цитированием
Старый 07.07.2011, 17:52   #4
MyIE
Форумчанин
 
Аватар для MyIE
 
Регистрация: 02.01.2010
Сообщений: 127
По умолчанию

По-просту говоря, мне нужен лишь принцип получений записей в цикле, в потоке.
Естественно о DBGrid тут речь не идет.
0_o
MyIE вне форума Ответить с цитированием
Старый 07.07.2011, 19:36   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Главного в посте вы не заметили
Цитата:
Хотя SetStatus закроет ADOQ1. В нем нужно другой ADOQuery использовать
Это и есть основная проблема
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.07.2011, 22:01   #6
MyIE
Форумчанин
 
Аватар для MyIE
 
Регистрация: 02.01.2010
Сообщений: 127
По умолчанию

Заметил я
Я попробывал уже и так, если я правильно вас понял:
Код:
  procedure StreamStatus.SetStatus(status, id: string);
  begin
    ADOQ1.SQL.Clear;
    ADOQ1.SQL.Add('UPDATE streams SET status = ''' + status +
        ''' WHERE stream_id = ''' + id + ''' ');
    ADOQ1.ExecSQL;
  end;

...

  procedure StreamStatus.Execute;

  var
    i, count, service: integer;
    stream_id: string;
  begin
    // Установка настроек 
    SetSettings;
    // Получаем число записей 
    count := 6;
    { Place thread code here }
    ADOQ2.SQL.Clear;
    ADOQ2.SQL.Add('SELECT * FROM streams');
    ADOQ2.Open;
    Streams.Open;
    {*
    for i := 1 to 1 do
    begin
      service := ADOQ1.Fields[3].AsInteger;
      stream_id := ADOQ1.Fields[9].AsString;
      CheckStatus(service, stream_id);
      ADOQ1.Open;
      //Streams.Open;
      ADOQ1.Next;
    end;
    *}
    while not ADOQ2.Eof do begin
      service := ADOQ2.Fields[3].AsInteger;
      stream_id := ADOQ2.Fields[9].AsString;
      CheckStatus(service, stream_id);
      ADOQ2.Open;
      ADOQ2.Next;
    end;
  end;
0_o
MyIE вне форума Ответить с цитированием
Старый 07.07.2011, 22:54   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Зачем перед ADOQ2.Next вставили ADOQ2.Open? Теперь ADOQ2 не должен закрываться из-за процедуры CheckStatus. А ошибки дает? И на какой команде?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.07.2011, 23:14   #8
MyIE
Форумчанин
 
Аватар для MyIE
 
Регистрация: 02.01.2010
Сообщений: 127
По умолчанию

Даже не знаю, что сказать
ADOQ2.Open нужен был, т.к. ошибка та же вылетала, что DataSet closed.
Не знаю как так, но после перезагрузуи delphi (Code Gear 2010) все стало работать.
Спс, что помог.

P.S. работает твой вариант с двумя ADOQuery
0_o
MyIE вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оишбка при выполнение запроса us4us Общие вопросы Delphi 1 21.05.2011 21:41
ADO.NET: Команды SQL при работе с DataSet PousheeITancuushee Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 0 24.09.2010 22:25
ошибка при закрытии формы после обработки в потоке furstenberg Общие вопросы Delphi 7 05.07.2010 12:19
Проблема при открытии базы при помощи ADO SlavaSH БД в Delphi 21 30.06.2009 16:51
Проблема с параметрами при работе С ADO А. Долматов БД в Delphi 22 30.11.2007 08:47