Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Table(s) open. Cannot perform this operation. - Почему? [D3, D5, IB5.x]


Fishka ©   (2002-11-01 16:15:00) 

Такая ошибка иногда возникает при удалении или добавлении записей в одну из таблиц БД. Все Table и Query закрыты.
Нажимаешь ОК, и программа продолжает работать. Никаких видимых ошибок вроде бы не происходит. Но необходимо, чтобы программа могла удалять и/или добавлять записи без вмешательства оператора, да и вообще это сообщение неприятно.
Что делать? (Backup/restore не помогло).


KoluChi   (2002-11-05 12:03:00) [1]

А ты попробуй

with DataBaseA,Q3 do
begin
Close;
if Q3.Active then ShowMessage("Q3 is open!");

Если я не прав, то помешать не должно.


Fishka   (2002-11-05 11:17:00) [2]

В любом случае в результате будет Q3.Close.


KoluChi   (2002-11-05 10:22:00) [3]

Такая ошибка возникает, возможно, из-за того что запрос остается открытым во время Prepare/Unprepare.

with DataBaseA,Q3 do
begin
Close; {DataBaseA.Close or Q3.Close ????}

Но это только предположение, надо ставить breakpointы и тестировать.


Fishka   (2002-11-05 09:28:00) [4]

Это одно из мест, где возможна эта ошибка. (Но программа выдает ошибку на разных вставляемых записях.В данных ошибок нет!! Иногда на той же порции данных может ошибку не выдавать.)

with DataBaseA,Q3 do
begin
Close;
SQL.Clear;
Q3.DatabaseName:=DataBaseA.DatabaseName;
if Prepared then UnPrepare;
Params.Clear;
SQL.Add("insert into "+name_table);
str1:=""; str2:="(";
for i:=0 to StrListFields.Count-1 do
begin
str1:=str1+StrListFields[i]+iif_s(i=StrListFields.Count-1,"",",");
str2:=str2+":p_"+StrListFields[i]+iif_s(i=StrListFields.Count-1,"",",");
//+inttostr(i)+iif_s(i=StrListFields.Count-1,"",",");
end;
SQL.Add("("+trim(str1,3)+")");
SQL.Add("values "+str2+")");
Prepare;

while not Q1.eof do
begin
inc(rr);
if rr mod 50=0 then
begin
Application.ProcessMessages;
FormLoad.Refresh;
end;

StartTransaction;
for i:=0 to Q1.FieldCount-1 do
begin
mPole:=Q1.Fields[i].AsString;
if not Q1.Fields[i].IsNull then
case Q1.Fields[i].DataType of
ftSmallint,ftInteger,ftWord: Params[i].Value:=strtoint(mPole);
ftFloat,ftBCD: Params[i].Value:=strtofloat(mPole);
ftString: Params[i].Value:=mPole;
ftDateTime,ftDate: Params[i].Value:=strtodate(mPole);
end {case}
else Params[i].DataType:=Q1.Fields[i].DataType;
end; {for i}
try
SBar.Panels[1].Text:=inttostr(rr);
SBar.Panels[2].Text:="";
ExecSQL;

inc(z_true);
Commit;
except
on E: Exception do
begin
WriteError(E.Message,mFile);
inc(z_false);
Rollback;
end; {do}
end; {try}
Q1.Next;
end; {while not eof}
end;
Q1.Close;


VAleksey   (2002-11-05 06:45:00) [5]

Код давай...
И насчет задержки тоже не отмахивайся. Электроны, конечно не спотыкаются, но винда может всбрыкнуть при вставке записей в цикле.


Fishka   (2002-11-04 17:45:00) [6]

Бог с ними, с извинениями.
А мысли какие-нибудь есть по данному вопросу?


Anatoly Podgoretsky   (2002-11-04 17:34:00) [7]

Извиняюсь,я не внимательно прочитал последнее сообщение


Fishka   (2002-11-04 17:29:00) [8]

"Table is busy"- таблица занята (но у меня НЕТ такого сообщения).
"Table(s) open."- ? (это то, что у меня).
Чем отличаются эти ошибки?


Anatoly Podgoretsky   (2002-11-04 17:19:00) [9]

Выявяляются новые подробности. Таблица занята


Fishka   (2002-11-04 17:12:00) [10]

А что конкретно означает это сообщение?
Почему, например, не "Table is busy"?


elv   (2002-11-04 15:02:00) [11]


> Fishka (01.11.02 16:15)

Ошибка в твоем коде.


Alexandr   (2002-11-04 12:32:00) [12]

ага, электроны спотыкаются на данных в базе данных.


Snake   (2002-11-04 12:29:00) [13]

Возможно, может быть процессор не успевает обрабатывать события на уровне БД. А что, если ставить где-нить задержку? Хотя с подобным сталкиваюсь впервые. Обычно, оно, либо работает вседа - либо не работает вовсе ;-)


Alexandr   (2002-11-04 11:19:00) [14]

решать проблему здесь вообще не имеет смысла, т.к. вопрошавший рано или поздно решит ее сам... или не решит...


Fishka   (2002-11-04 11:06:00) [15]

Ошибка возникает непредсказуемо. Проводили эксперимент с одной и той же порцией данных. Ошибка возникает в разных местах или вообще не возникает. Но всегда с одной и той же таблицей. Количество записей в таблице больше 1 млн.
Кусок кода приводить не имеет смысла, т.к. Insert через параметры и в цикле.


Johnmen   (2002-11-01 17:05:00) [16]

А просто кусок кода ?


Fishka   (2002-11-01 16:56:00) [17]

Insert into ....


Johnmen   (2002-11-01 16:44:00) [18]

А как добавляются записи ?


Fishka   (2002-11-01 16:29:00) [19]

Допустим, надо добавить 200 записей.
На какой-нибудь 150 выдается это сообщение, нажимаю ОК, и программа продолжает работать, запись вносится. Ничего криминального в данной конкретной записи я не вижу.
ЧТО ДЕЛАТЬ?


Johnmen   (2002-11-01 16:24:00) [20]

БД здесь непричем...Ошибка в программе...


Наверх

Титульная страница Поиск, карта сайта Написать письмо