![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Силов моих больше нету! Не хотят работать многопоточные таблицы!
Aleksandr. © (2004-06-18 13:45:00)Скажите, люди, есть какие компоненты или статьи на тему конвертации ADO-таблиц в БДЕ-таблицы в многопоточном режиме? Какие-то безумные ошибки все время вылетают, зависы, памяти на что-то не хватает...
Aleksandr. (2004-06-18 17:21:00) [1]sniknik ©: По поводу OpenDataSource('Microsoft.Jet.OLEDB.4.0'...
- не работает это у меня, с самого начала пытался, чего не хватает, не знаю.
Цитирую себя: "у нас есть varchar(8000), трактуемый как ftString" - при обращении к полю, в MS SQL объявленному как varchar(8000), а такое приходится делать для триггеров, они с типом Text не работают - Делфи при обращении к такому полю очень часто считает его ftString с размером 8000, а для парадокса оно может быть только ftMemo.
sniknik (2004-06-18 16:37:00) [2]> А как Вы представляете "простой" запрос?
примерно так
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 16:02:00) [3]Digitman © : Компоненты TSession и TTable индивидуальны для каждого потока, компонента TDataBase там нет, потому как при попытке работать с TTable через TDataBase.DataBaseName вылетает ошибка, что такой уже есть (папка у всех одинаковая). Главный напряг, как я подозреваю, из-за того, что для 59 потоков слишком много получается объектов.
sniknik © : А как Вы представляете "простой" запрос? Сделать Create Table - то же самое - "Insufficient memory for this operation", поэтому роли не играет. А вручную конвертация - я там в коде указал причину - на MS SQL в таблицах есть несоответствия типов полей с парадоксовыми.
sniknik (2004-06-18 15:44:00) [4]> Не придирайтесь по мелочам. Код:
не буду, в обмен на инфу о типах исходной и получаемой таблицы.
просто не пойму зачем такие сложности вместо простого запроса, может движок их не позволяет?
Digitman (2004-06-18 15:32:00) [5]объект TTable должен быть индивидуален для каждого код.потока
объекты TDatabase и TSession, на которые ссылается объект TTable, так же должны быть индивидуальны для каждого код.потока
bushmen (2004-06-18 15:30:00) [6]>sniknik © (18.06.04 14:58) [5]
Тогда это вершина мастерства просто! :)
Aleksandr. (2004-06-18 15:28:00) [7]Сорри, пока комментарии чистил, удалил:
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
Aleksandr. (2004-06-18 15:17:00) [8]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 вылезает куча ошибок, начинающихся с "Недостаточно памяти для операции...".
Skyle (2004-06-18 15:14:00) [9]Интересно, а конвертируются многопоточные таблицы или их не менее многопоточное содержимое? ;-)
sniknik (2004-06-18 14:58:00) [10]bushmen © (18.06.04 14:52) [4]
в заголовке.
bushmen (2004-06-18 14:52:00) [11]>sniknik © (18.06.04 14:46) [3]
Там было написано "многопоточный режим"
sniknik (2004-06-18 14:46:00) [12]а мне бы хотелось посмотреть на "многопоточные таблицы", это же новое слово в базах данных. ;)
Vlad (2004-06-18 14:44:00) [13]
> bushmen © (18.06.04 13:49) [1]
> ? Хорошо бы код привести и ошибки, которые вылетают :))))
EConvertError: Cannot convert ADOTable to BDETable
:-)
bushmen (2004-06-18 13:49:00) [14]Что такое ADO-таблицы и BDE-таблицы? И как ты их конвертируешь? Хорошо бы код привести и ошибки, которые вылетают :))))