Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.25;
Скачать: CL | DM;

Вниз

как из delphi при помощи dbexpress создавать временные таблицы   Найти похожие ветки 

 
16alex ©   (2007-01-05 18:03) [0]

попробовал создавать временные таблицы в dbepress,но видимо я еще слишком мало знаю, чтобы не делать ошибок:
try
datamodule2.SQLConnection1.StartTransaction(tr);
datasetprovider1.DataSet:=sqlquery4;
sqlquery4.Close;
sqlquery4.SQL.Add("create temporary table a select name from city");
sqlquery4.ExecSQL;
// sqlquery4.Close;
sqlquery4.SQL.Clear;
sqlquery4.sql.Add("select name from a");
sqlquery4.Open;
datamodule2.SQLConnection1.Commit(tr);
except
datamodule2.SQLConnection1.Rollback(tr);
form1.show("Îøèáêà");
end;
При пошаговой отладке на строчке sqlquery4.Open возникает ошибка:
"Table "avia.a" doesn"t exist"
Наверное я что-то капитально не понимаю, ведь несколькими строками выше таблица вроде бы благополучно создалась
Примечание: из клиента поставляемого вместе с mysql временные таблицы создаются без ошибок
Уважаемые мастера, помогите чем можете


 
Desdechado ©   (2007-01-05 18:07) [1]

dbexpress тут ни при чем.
Это просто механизм передачи команд на сервер и получения от него результатов. Все команды выполняет сам сервер.
Раз он тебя обругал (сервер), значит ты неправильно используешь временные таблицы.

ЗЫ не понимаю, зачем тебе они нужны здесь и вообще.
Без них можно прекрасно работать.


 
16alex ©   (2007-01-05 19:08) [2]

как без них(временных таблиц),если та версия mysql, c которой я работаю не поддерживает вложенные запросы(те версии mysql где  они появляются не поддерживаются борландским dbexpress).
Поясните пожалуйста насчет механизма передачи команд на сервер
(ведь та же самая команда подданная из стандартного клиента прекрасно работает)


 
RayGun ©   (2007-01-05 19:51) [3]


> try
> datamodule2.SQLConnection1.StartTransaction(tr);
> datasetprovider1.DataSet:=sqlquery4;
> sqlquery4.Close;  sqlquery4.SQL.Add("create temporary table a select name from
> city");
> sqlquery4.ExecSQL;
> // sqlquery4.Close;
> sqlquery4.SQL.Clear;
> sqlquery4.sql.Add("select name from a");
> sqlquery4.Open;
> datamodule2.SQLConnection1.Commit(tr);


Возможно, причина в том, что Вы выполнили инструкцию создания таблицы, но еще не завершили транзакцию, а при этом пытаетесь сделать выборку из еще пока не созданной таблицы (обратите внимание на порядок следования выделенных строк - Commit надо делать до select name from a)


 
RayGun ©   (2007-01-05 19:55) [4]

Нужно также учитывать, что в MySQL транзакции работают только на таблицах типа InnoDB, для остальных типов действует только блокировка на уровне таблиц.


 
16alex ©   (2007-01-05 20:04) [5]

а если city таблица типа Innodb, то и временная таблица a  
автоматически будет Innodb? (наверное полная ерунду пишу)


 
RayGun ©   (2007-01-05 20:11) [6]

> 16alex ©   (05.01.07 20:04) [5]

> а если city таблица типа Innodb, то и временная таблица a  
> автоматически будет Innodb? (наверное полная ерунду пишу)

Да вроде нет, не ерунду, в описании сказано, что временная таблица автоматически примет нужную структуру.


 
16alex ©   (2007-01-05 20:14) [7]

попробовал Commit  до select name from a, не помогает


 
RayGun ©   (2007-01-05 20:28) [8]

А если попробовать закомментировать
sqlquery4.SQL.Clear;
sqlquery4.sql.Add("select name from a");
sqlquery4.Open;

а после выполнения данного кода посмотреть из клиента MySQL, создалась ли временная таблица?


 
16alex ©   (2007-01-05 20:42) [9]

временная таблица не создается, а вот если обычную попробовать, то получается, наверное придется действовать по следующей cхеме: создать
таблицу, а по завершению работы приложения удалить ее


 
RayGun ©   (2007-01-05 20:45) [10]

> 16alex ©   (05.01.07 20:14) [7]

> попробовал Commit  до select name from a, не помогает


Т.е. не помогает вот так:


try
 datamodule2.SQLConnection1.StartTransaction(tr);
 try
   datasetprovider1.DataSet:=sqlquery4;
   sqlquery4.Close;
   sqlquery4.SQL.Add("create temporary table a select name from city");
   sqlquery4.ExecSQL;
   datamodule2.SQLConnection1.Commit(tr);
 except
   datamodule2.SQLConnection1.Rollback(tr);
   form1.show("Îøèáêà");
 end;
 datamodule2.SQLConnection1.StartTransaction(tr);
 try
   sqlquery4.SQL.Clear;
   sqlquery4.sql.Add("select name from a");
   sqlquery4.Open;
   datamodule2.SQLConnection1.Commit(tr);
 except
   datamodule2.SQLConnection1.Rollback(tr);
   form1.show("Îøèáêà");
 end;
except
 form1.show("Îøèáêà");
end;


 
RayGun ©   (2007-01-05 20:48) [11]

> 16alex ©   (05.01.07 20:42) [9]

> временная таблица не создается, а вот если обычную попробовать, то
> получается, наверное придется действовать по следующей cхеме: создать
> таблицу, а по завершению работы приложения удалить ее


Странно... Значит, какой-то глюк в dbexpmysql.dll, раз из клиента MySQL создается, а через dbExpress нет.


 
Desdechado ©   (2007-01-05 20:50) [12]

> создать таблицу, а по завершению работы приложения удалить ее
Не мытьем, так катанием?

ЗЫ
Менять метаданные - очень ресурсоемкая для сервера операция. Представь, что у тебя одновременно работает 1000 пользователей и каждый создает-удаляет таблицы. Интересно, сколько проживет сервер?


 
16alex ©   (2007-01-05 20:57) [13]

приблизительно так за исключением, того что
select name from a не выделено в транзакцию и отсутствием
некоторых проверок try except


 
RayGun ©   (2007-01-05 20:58) [14]

> Desdechado ©   (05.01.07 20:50) [12]

> Менять метаданные - очень ресурсоемкая для сервера операция. Представь, что > у тебя одновременно работает 1000 пользователей и каждый создает-удаляет
> таблицы. Интересно, сколько проживет сервер?


Можно не менять метаданные в процессе работы, а заранее создать нужные временные таблицы.


 
16alex ©   (2007-01-05 21:08) [15]

а это как?


 
16alex ©   (2007-01-05 21:27) [16]


> а это как?

Заранее это перед запуском программы что-ли (ведь временные таблицы живут только в течении сеанса работы пользователя)


 
RayGun ©   (2007-01-05 21:30) [17]

> 16alex ©   (05.01.07 21:27) [16]

> Заранее это перед запуском программы что-ли (ведь временные таблицы живут
> только в течении сеанса работы пользователя)

Я неправильно выразился, не временные, а обычные таблицы для временных целей, как Вы и хотели (16alex ©   (05.01.07 20:42) [9]), но не каждый раз создавать/удалять, а заранее предусмотреть их в структуре БД. Так многие делали на ранних версиях MySQL.



Страницы: 1 вся ветка

Текущий архив: 2007.03.25;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.028 c
15-1173040286
ArtemESC
2007-03-04 23:31
2007.03.25
PHP


15-1172479522
xayam
2007-02-26 11:45
2007.03.25
Музыка из фильма Призрачный гонщик


8-1149250079
Der Nechk@ssoff
2006-06-02 16:07
2007.03.25
Подключение playlistoв


1-1170246835
adnan123
2007-01-31 15:33
2007.03.25
проблема с юникодом


2-1173021118
Tru
2007-03-04 18:11
2007.03.25
Enabled