
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
Сообщ.
#1
,
|
|
|
Вставка происходит следующим образом (TAccessWorker - мой класс работы с MS Access):
при создании формы: ![]() ![]() ta := TAccessWorker.Create('db1.mdb'); вставка происходит так (TGood - произвольный класс): ![]() ![]() good := TGood.Create; good.SetId(ta.getLastGoodId + 1); ta.insertGood(good); TAccessWorker.insertGood(good);(SQLInsert взят из DRKB) ![]() ![]() 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 ![]() ![]() 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; ![]() ![]() 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: ![]() ![]() ... SQL.Text := 'SELECT id from goods'; Open; Last; ... Также, если производить вставки в БД с меньгим интервалом, то программа падает с EOleException из-за того что я пытаюсь вставить запись с уже существующим Id. То есть видно getLastGoodId возращает ещё необновившийся id. Подскажите как бороться с этими 2-я проблемами... |
Сообщ.
#2
,
|
|
|
а зачем ты сам себе жизни услажняешь со всем этим делом?
нафига ты писал все эти функции и процедуры, когда можно всё сделать намного короче и практичнее! возможно что у тебя где просто идёт очень большая утечка памяти... надо дебажить... |
![]() |
Сообщ.
#3
,
|
|
Зарегистрируй ID поле как счётчик и убери код генерации следующего ID из своего кода.
|
Сообщ.
#4
,
|
|
|
а он наверное бездырочную нумерацию хочет
![]() Кроме того, откуда видно, что метод getLastId возвращает именно Last ID? Он, судя по запросу, хватает первый попавшийся, может там МАХ поставить? |
![]() |
Сообщ.
#5
,
|
|
Цитата Игорь Акопян @ Не, там в коде есть Last. Если первичного ключа нет, то выбирает ID близкое к максимальному.Он, судя по запросу, хватает первый попавшийся SkyStar, если всё таки хочешь сам генерировать ИД (хотя багов при таком подходе бывает немеряно) то измени запрос так, как советует Игорь Акопян. |
Сообщ.
#6
,
|
|
|
Цитата MIF @ Не, там в коде есть Last. упс.. проглядел ![]() |