На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Обязательно указание:
1) типа базы данных (Paradox/Oracle/Interbase и т.п.)
2) способа доступа к базе данных (ODBC/ADO/DAO/BDE и т.п.)
Например: Paradox/BDE, MS Access/ADO

Наиболее часто задаваемые вопросы:
Базы даных для начинающих. Первые шаги. Понятие о BDE.
Переход на клиент-сервер и начала ADO
Приёмы работы с BLOB (OLE/Memo) полями
Запросы и параметры или как избавиться от многих проблем. Проблемы с датами в запросах.
Нужели мне нужно устанавливать BDE? (или почему не работает программа на другом компьютере)
Модераторы: Bas, Rouse_
  
> Ошибка вставки записи в БД MS Access
    Вставка происходит следующим образом (TAccessWorker - мой класс работы с MS Access):

    при создании формы:
    ExpandedWrap disabled
      ta := TAccessWorker.Create('db1.mdb');


    вставка происходит так (TGood - произвольный класс):
    ExpandedWrap disabled
      good := TGood.Create;
      good.SetId(ta.getLastGoodId + 1);
       
      ta.insertGood(good);


    TAccessWorker.insertGood(good);(SQLInsert взят из DRKB)
    ExpandedWrap disabled
       procedure TAccessWorker.insertGood(good :TGood);
        var
          query :TADOQuery;
        begin
          query := TADOQuery.Create(nil);
       
          with query do begin
            ConnectionString := globalDbConnectionString;
            SQL.Text := SqlInsert(
              [good.GetId, good.GetParentId, good.GetName, good.GetDescription, CurrToStr(good.GetPrice), good.GetQuantity],
              'goods'
            );
            ExecSQL;
            Close;
          end;
        end;


    TAccessWorker.getLastGoodId - выясняет значение последнего id
    ExpandedWrap disabled
        function TAccessWorker.getLastGoodId : Integer;
        var
          query :TADOQuery;
          num :String;
        begin
          query := TADOQuery.Create(nil);
          with query do begin
            ConnectionString := globalDbConnectionString;
            SQL.Text := 'SELECT id from goods';
            Open;
            Last;
       
            num := FieldByName('id').AsString;
            if(num <> '') then begin
              Result := StrToInt(num);
            end else begin
              Result := -1;
            end;
       
            Close;
          end;
        end;


    ExpandedWrap disabled
      globalDbConnectionString :=
                'Provider=Microsoft.Jet.OLEDB.4.0;' +
                'Data Source=' + fileName + ';' +
                'Persist Security Info=False;' +
                'Jet OLEDB:Database Password=' + password;


    Когда я произвожу подряд 32 вставки (между вставками промеуток времени ~1 сек), то после 32-ой итерации, у меня программа падает и выкидывает такой exception (падает постоянно и ИМЕННО после 32-х вставок подряд): EOleException "Неопознанная ошибка"

    Падает он в методе getLastId в строке c Open:
    ExpandedWrap disabled
      ...
      SQL.Text := 'SELECT id from goods';
      Open;
      Last;
      ...
    .

    Также, если производить вставки в БД с меньгим интервалом, то программа падает с EOleException из-за того что я пытаюсь вставить запись с уже существующим Id. То есть видно getLastGoodId возращает ещё необновившийся id.

    Подскажите как бороться с этими 2-я проблемами...
    Сообщение отредактировано: SkyStar -
      а зачем ты сам себе жизни услажняешь со всем этим делом?
      нафига ты писал все эти функции и процедуры, когда можно всё сделать намного короче и практичнее!
      возможно что у тебя где просто идёт очень большая утечка памяти...
      надо дебажить...
        Зарегистрируй ID поле как счётчик и убери код генерации следующего ID из своего кода.
          а он наверное бездырочную нумерацию хочет :)
          Кроме того, откуда видно, что метод getLastId возвращает именно Last ID? Он, судя по запросу, хватает первый попавшийся, может там МАХ поставить?
          Сообщение отредактировано: Игорь Акопян -
            Цитата Игорь Акопян @
            Он, судя по запросу, хватает первый попавшийся
            Не, там в коде есть Last. Если первичного ключа нет, то выбирает ID близкое к максимальному.
            SkyStar, если всё таки хочешь сам генерировать ИД (хотя багов при таком подходе бывает немеряно) то измени запрос так, как советует Игорь Акопян.
              Цитата MIF @
              Не, там в коде есть Last.

              упс.. проглядел :)
              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0579 ]   [ 15 queries used ]   [ Generated: 17.06.25, 02:12 GMT ]