Текущий архив: 2004.07.18;
Скачать: CL | DM;
Вниз
Силов моих больше нету! Не хотят работать многопоточные таблицы! Найти похожие ветки
← →
Aleksandr. (2004-06-18 13:45) [0]Скажите, люди, есть какие компоненты или статьи на тему конвертации ADO-таблиц в БДЕ-таблицы в многопоточном режиме? Какие-то безумные ошибки все время вылетают, зависы, памяти на что-то не хватает...
← →
bushmen © (2004-06-18 13:49) [1]Что такое ADO-таблицы и BDE-таблицы? И как ты их конвертируешь? Хорошо бы код привести и ошибки, которые вылетают :))))
← →
Vlad © (2004-06-18 14:44) [2]
> bushmen © (18.06.04 13:49) [1]
> ? Хорошо бы код привести и ошибки, которые вылетают :))))
EConvertError: Cannot convert ADOTable to BDETable
:-)
← →
sniknik © (2004-06-18 14:46) [3]а мне бы хотелось посмотреть на "многопоточные таблицы", это же новое слово в базах данных. ;)
← →
bushmen © (2004-06-18 14:52) [4]>sniknik © (18.06.04 14:46) [3]
Там было написано "многопоточный режим"
← →
sniknik © (2004-06-18 14:58) [5]bushmen © (18.06.04 14:52) [4]
в заголовке.
← →
Skyle © (2004-06-18 15:14) [6]Интересно, а конвертируются многопоточные таблицы или их не менее многопоточное содержимое? ;-)
← →
Aleksandr. (2004-06-18 15:17) [7]sniknik © : "многопоточные таблицы" для краткости, потому как в САБЖ не слишком влезает. Не придирайтесь по мелочам. Код:
// код метода в потока, выполняющего создание таблицы,
// FQuery - TADOQuery, FTable - TTable
var
bActive : boolean;
i : integer;
FT : TFieldType;
begin
try
bActive:=FQuery.Active;
FQuery.Open;
FQuery.FieldDefs.Update;
if Assigned(FTable.FieldDefs) then
FTable.FieldDefs.Clear;
if Assigned(FTable.IndexDefs) then
FTable.IndexDefs.Clear;
FTable.StoreDefs:=true;
for i:=0 to FQuery.FieldDefs.Count-1 do begin
FT:=FQuery.FieldDefs[i].DataType;
if (FT IN [ftString,ftWideString]) AND (FQuery.FieldDefs[i].Size>255) then
FT:=ftMemo; // есть у нас varchar(8000), трактуемый как ftString
FTable.FieldDefs.Add(FQuery.FieldDefs[i].Name,FT,0,FQuery.FieldDefs[i].Required)
end
end;
FTable.CreateTable;
if FAddIndex then begin
FTable.Exclusive:=true;
try
case FIndexCount of
1 : FTable.AddIndex("",FQuery.FieldDefs[0].Name,[ixPrimary]);
2 : FTable.AddIndex("",FQuery.FieldDefs[0].Name+";"+FQuery.FieldDefs[1].Name,[ixPrimary]);
end
finally
FTable.Exclusive:=false
end
end;
FQuery.Active:=bActive
except
on E:Exception do
FErrorStr:=+E.Message
end
end;
А Execute потока совсем прост:
begin
try
Sleep(0);
CreatePXTableFromADO
finally
SetEvent(FEvent) // это установить флажок, что работу закончил
end
end
Ну и на CreateTable вылезает куча ошибок, начинающихся с "Недостаточно памяти для операции...".
← →
Aleksandr. (2004-06-18 15:28) [8]Сорри, пока комментарии чистил, удалил:
if FT IN NullSizeTypeSet then
FTable.FieldDefs.Add(FQuery.FieldDefs[i].Name,FT,0,FQuery.FieldDefs[i].Required)
else
FTable.FieldDefs.Add(FQuery.FieldDefs[i].Name,FT,FQuery.FieldDefs[i].Size,FQuery.FieldDefs[i].Required)
и
FErrorStr:="Error in create table: "+E.Message
← →
bushmen © (2004-06-18 15:30) [9]>sniknik © (18.06.04 14:58) [5]
Тогда это вершина мастерства просто! :)
← →
Digitman © (2004-06-18 15:32) [10]объект TTable должен быть индивидуален для каждого код.потока
объекты TDatabase и TSession, на которые ссылается объект TTable, так же должны быть индивидуальны для каждого код.потока
← →
sniknik © (2004-06-18 15:44) [11]> Не придирайтесь по мелочам. Код:
не буду, в обмен на инфу о типах исходной и получаемой таблицы.
просто не пойму зачем такие сложности вместо простого запроса, может движок их не позволяет?
← →
Aleksandr. (2004-06-18 16:02) [12]Digitman © : Компоненты TSession и TTable индивидуальны для каждого потока, компонента TDataBase там нет, потому как при попытке работать с TTable через TDataBase.DataBaseName вылетает ошибка, что такой уже есть (папка у всех одинаковая). Главный напряг, как я подозреваю, из-за того, что для 59 потоков слишком много получается объектов.
sniknik © : А как Вы представляете "простой" запрос? Сделать Create Table - то же самое - "Insufficient memory for this operation", поэтому роли не играет. А вручную конвертация - я там в коде указал причину - на MS SQL в таблицах есть несоответствия типов полей с парадоксовыми.
← →
sniknik © (2004-06-18 16:37) [13]> А как Вы представляете "простой" запрос?
примерно так
INSERT INTO OpenDataSource("Microsoft.Jet.OLEDB.4.0", "Data Source="D:\";User ID=Admin;Password=;Extended properties=Paradox 7.x")...ParadoxTable
SELECT * FROM MSSQLTable
> Сделать Create Table - то же самое - "Insufficient memory for this operation", поэтому роли не играет.
см. Digitman © (18.06.04 15:32) [10]
+ насколько помню с BDE гдето 10-12 сессий можно создать на одной машине, (запусти любую программу которая использует BDE и всего лиш открывает 1 таблицу, пусть пустую, на одной машине 15раз, уверен не получится), для смены этого дефаулта надо чтото в настройках править.
> А вручную конвертация - я там в коде указал причину - на MS SQL в таблицах есть несоответствия типов полей с парадоксовыми.
чегото я до [12] поста и слов то таких не видел MS SQL, Paradox, ...
если знаеш причину зачем спрашиваеш? (только вряд ли она в этом, мемо поля в парадоксе есть, точно тебе говорю... ;)
← →
Aleksandr. (2004-06-18 17:21) [14]sniknik ©: По поводу OpenDataSource("Microsoft.Jet.OLEDB.4.0"...
- не работает это у меня, с самого начала пытался, чего не хватает, не знаю.
Цитирую себя: "у нас есть varchar(8000), трактуемый как ftString" - при обращении к полю, в MS SQL объявленному как varchar(8000), а такое приходится делать для триггеров, они с типом Text не работают - Делфи при обращении к такому полю очень часто считает его ftString с размером 8000, а для парадокса оно может быть только ftMemo.
Страницы: 1 вся ветка
Текущий архив: 2004.07.18;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.024 c