Форум: "Базы";
Текущий архив: 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