Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.03.25;
Скачать: [xml.tar.bz2];

Вниз

как из 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.071 c
1-1169653503
DevilDevil
2007-01-24 18:45
2007.03.25
WordWrap у Chechbox-а


2-1172838073
LigthStone
2007-03-02 15:21
2007.03.25
ReleaseCapture


2-1172731737
Abcdef123
2007-03-01 09:48
2007.03.25
SQL запрос


15-1172743261
Игорь Шевченко
2007-03-01 13:01
2007.03.25
Нужна ли локализация Delphi на русский язык ?


2-1172857538
pasha star
2007-03-02 20:45
2007.03.25
OnВыбрал это окно





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский