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

Вниз

Получение первой записи в таблице   Найти похожие ветки 

 
leonidus   (2008-03-31 12:59) [0]

Мне необходимо получить первую запись из таблицы Access и изменить в ней два поля, делаю так:

 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add("select top 1 * from tab");
 ADOQuery1.ExecSQL;
 ADOQuery1.Close;

 ADOQuery1.FieldByName("active_word").AsBoolean:=true;
 ADOQuery1.FieldByName("status").AsString:="learning";

но получаю сообщение что поле не существует... "ADOQuery1.Close" ставил и после попытки изменения поля и перед ним, толку никакого. В чем может быть трабла?


 
clickmaker ©   (2008-03-31 13:01) [1]


> ADOQuery1.ExecSQL;
>  ADOQuery1.Close;

первое замени на Open;
второе только после изменения
лучше обернуть в try - finally


 
Reindeer Moss Eater ©   (2008-03-31 13:02) [2]

В том, что после закрытия экземпляры полей уничтожаются


 
Sergey13 ©   (2008-03-31 13:06) [3]

> [0] leonidus   (31.03.08 12:59)
> толку никакого. В чем может быть трабла?

В отсутствии понимания того, что делаешь.
Датасет перед редактированием желательно переводить в режим редактирования. А после редактирования желательно фиксировать изменения.


 
leonidus   (2008-03-31 13:28) [4]

Всем спасибо, вот работающий код:

 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add("select top 1 * from tab");
 ADOQuery1.Open;
 ADOQuery1.Edit;
 ADOQuery1.FieldByName("active_word").AsBoolean:=true;
 ADOQuery1.FieldByName("status").AsString:="learning";
 ADOQuery1.Post;
 ADOQuery1.Close;


 
Sergey13 ©   (2008-03-31 13:30) [5]

> [4] leonidus   (31.03.08 13:28)
> Всем спасибо, вот работающий код:

Остается понять что же он будет делать. 8-)


 
Anatoly Podgoretsky ©   (2008-03-31 13:47) [6]

> leonidus  (31.03.2008 12:59:00)  [0]

О какой такой еще первой записи идет речь, когда здесь выбирается всего одна и та произвольная.


 
Правильный_Вася   (2008-03-31 14:06) [7]

это не первая запись, это первая попавшаяся запись


 
leonidus   (2008-04-01 12:45) [8]

А почему "первая попавшаяся" запись, поясните пожалуйста?

И еще один момент, не догоняю на счет параметров:

если делаю так:
 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add("select top 7 * from tab WHERE tab.status=:Str2");
 ADOQuery1.Parameters.ParamByName("Str2").Value:="learning";
 ADOQuery1.Open;

но все нормально, однако стоит сделать так:

 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add("select top :Str1 * from tab WHERE tab.status=:Str2");
 ADOQuery1.Parameters.ParamByName("Str1").Value:=kol_learning_words;
 ADOQuery1.Parameters.ParamByName("Str2").Value:="learning";
 ADOQuery1.Open;

то получаю ошибку "ошибочное или пропущенное зарезервированное слово или аргумент в конструкции SELECT"...


 
clickmaker ©   (2008-04-01 12:50) [9]


> [8] leonidus   (01.04.08 12:45)
> А почему "первая попавшаяся" запись, поясните пожалуйста?

потому что order by нету


> то получаю ошибку "ошибочное или пропущенное зарезервированное
> слово или аргумент в конструкции SELECT"...

top может быть только константой
используй Format


 
Ega23 ©   (2008-04-01 12:53) [10]


> А почему "первая попавшаяся" запись, поясните пожалуйста?


Потому, что нет никакой гарантии, что запрос select * from table будет выдавать строго одну и ту же выборку.

Кстати, под Postgres впервые это увидел - реально без сортировки на select * приходят разные выборки.


 
Reindeer Moss Eater ©   (2008-04-01 12:54) [11]

потому что order by нету

был такой прикол.
рисую запрос с ордербаем и rownum=1 на оракле.
сижу, жду, что в выборку попадет то что хочу.
А оптимизатор решил, что ему проще сделать сначала rownum=1, а потом уже отсортировать полученную выборку.
правда дело было на сервере...


 
Sergey13 ©   (2008-04-01 12:56) [12]

> [11] Reindeer Moss Eater ©   (01.04.08 12:54)
> А оптимизатор решил, что ему проще сделать сначала rownum=1,
> а потом уже отсортировать полученную выборку

Так это стандартное поведение вроде для оракла.


 
Anatoly Podgoretsky ©   (2008-04-01 13:21) [13]

> Reindeer Moss Eater  (01.04.2008 12:54:11)  [11]

В топку такой интерпритатор и оптимизатор, который выдает неверные данные.


 
Reindeer Moss Eater ©   (2008-04-01 13:23) [14]

все решилось обертыванием одного запроса другим


 
leonidus   (2008-04-01 13:47) [15]

исправил запрос с применением ORDER BY:

ADOQuery1.SQL.Add("select top 7 * from tab WHERE tab.status=:Str2 ORDER BY tab.header");

теперь вопрос к clickmaker, а что это за Format такой, как его использовать?


 
clickmaker ©   (2008-04-01 13:53) [16]


> а что это за Format такой, как его использовать?

функция
Stmt := Format("select top %d * from tab WHERE tab.status=:Str2 ORDER BY tab.header", [NumRows]);


 
leonidus   (2008-04-01 15:02) [17]

clickmaker большое спасибо, разобрался


 
ANB   (2008-04-01 17:28) [18]


> А оптимизатор решил, что ему проще сделать сначала rownum=1,
>  а потом уже отсортировать полученную выборку.
> правда дело было на сервере...

Дык он так и должен работать. И в доке написано.
Класический тест для "опытных" ораклистов.
Сначала отрабатывает where потом сортировка. Выход - вложенный запрос. Оракл корректно все это понимает. Есть обход - указать индекс в хинте index_desc или index_asc. Тогда мона обойтись обычным запросом.


 
Кщд   (2008-04-03 07:42) [19]

>ANB   (01.04.08 17:28) [18]
>Есть обход - указать индекс в хинте index_desc или index_asc.
этот "обход" - прямая дорога к трудноуловимым ошибкам (не говоря о том, что оптимизатор может просто проигнорировать хинт)
порядок сортировки гарантирует только order by
как сканировать индекс - это внутреннее дело oracle и далеко не факт, что скан пойдет в естественном порядке
в целом, согласен, не ясно, отчего применение фильтра(предиката) перед сортировкой вызывает удивление



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

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

Наверх




Память: 0.51 MB
Время: 0.025 c
15-1208159604
Костик
2008-04-14 11:53
2008.09.28
.net или нет?


2-1219137611
AlexanderMS
2008-08-19 13:20
2008.09.28
Нужно ли делать такие вызовы перед выходом из программы?


2-1219221866
Элек_Троник
2008-08-20 12:44
2008.09.28
Организация хранения результатов запросов через API в памяти


2-1218968367
altatr
2008-08-17 14:19
2008.09.28
Как узнать об активных сетевых подключениях


15-1218053693
Franciscosuarez
2008-08-07 00:14
2008.09.28
Красивая задача...может и встречалась тут)))не знаю