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

Вниз

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

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

Наверх





Память: 0.49 MB
Время: 0.047 c
15-1218265100
Dmitry S
2008-08-09 10:58
2008.09.28
Кодирование видео


2-1219122526
kate158
2008-08-19 09:08
2008.09.28
сдвиг данных в dbgrid e на 1 вверх


2-1219302166
Fynjy
2008-08-21 11:02
2008.09.28
использовать IBQuery в разных юнитах


3-1207037596
Karburator
2008-04-01 12:13
2008.09.28
отменить добавление записи в триггере


2-1219226715
Jolik
2008-08-20 14:05
2008.09.28
Как установить соединение через прокси?...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский