Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Пустой RecordSet / 10 сообщений из 10, страница 1 из 1
07.01.2005, 12:43:06
    #32855973
Andrey13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пустой RecordSet
Проблема у меня следующая.

Есть таблицы Addind, и Doc
В Adding может быть, а может и не быть записи с ключом Key=10
Мне надо добавить из Doc в Adding запись с ключом Key=10 если в Adding этой записи небыло раньше, а если была просто изменить.

Можно так

Сначала
TheConn.Execute ("DELETE Adding.*, Adding.KodDoc From Adding WHERE (((Adding.Key)=10")
Потом

TheConn.Execute ("INSERT INTO Adding ...

Работает но некрасиво, долго, и т.д.

Скорее всего все сводится к следующему: мне надо определить есть ли в
Adding записть с Key=10, а потом уже решать что делать

INSERT INTO Adding ... или UPDATE Adding ...

Вопрос в том как это сделать правильно, и чтобы работало быстро?
Т.е. классически.
Спасибо.
...
Рейтинг: 0 / 0
07.01.2005, 13:31:41
    #32855986
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пустой RecordSet
Нечто в этом роде

Код: plaintext
1.
2.
3.
rs.Find("Key=10")
if rs.Count =  1  then
     Update ...
else Insert...

Можно также воспользоваться фильтром.
Либо запихнуть все в хранимку с параметром ключа.

Код: plaintext
1.
2.
3.
if exists(select KeyA From Adding WHERE KeyA = 10 )
Update ...
else
Insert
Magnus
...
Рейтинг: 0 / 0
09.01.2005, 19:22:01
    #32856915
Andrey13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пустой RecordSet
Когда задавал вопрос то упростил для key=10, на самом деле надо было добавить все несуществующие записи из Doc в Adding для любых Key

(Как спросишь так и ответят)

Сделал так:

SELECT Doc.KodN, Doc.NameN, Doc.Summa
FROM Doc LEFT JOIN Adding ON Doc.Key = Adding.Key
WHERE (((Adding.Key) Is Null));

потом весть этот SELECT добавил в Adding.
Большое спасибо за консультации.

P.S. Теперь, по моему можно смело делать UPDATE Adding, записи не потеряются.

А как правильно определить пустой ли RecordSet

rs.open ("SELECT Doc.KodN, Doc.NameN, Doc.Summa
FROM Doc LEFT JOIN Adding ON Doc.Key = Adding.Key
WHERE (((Adding.Key) Is Null))") ?

Спасибо.
...
Рейтинг: 0 / 0
10.01.2005, 04:24:39
    #32857111
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пустой RecordSet
if rs.count = 0 ...
значит запрос записей не вернул.


Magnus
...
Рейтинг: 0 / 0
11.01.2005, 13:57:46
    #32859071
_bob
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пустой RecordSet
1. не всякий рекордсет можно сосчитать
2. rs.eof and rs.bof значительно быстрее, чем rs.count = 0, особенно если rs не пустой

------------------
Best regards, _bob
...
Рейтинг: 0 / 0
11.01.2005, 14:56:45
    #32859282
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пустой RecordSet
Конечно не всякий, от типа курсора зависит. Инфы о типе и расположении курсора не было, поэтому угадывать я не буду.
А разница в скорости - миллисекунды, весьма незначительно. Если уж бороться за них то делать это все нужно в хранимке.

Magnus
...
Рейтинг: 0 / 0
11.01.2005, 15:49:32
    #32859480
_bob
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пустой RecordSet
не надо ля-ля, время выполнения .count линейно зависит от числа записей в рекордсете и может составлять десятки секунд на очень быстрой машине, а время .bof and .eof - от числа записей не зависит
------------------
Best regards, _bob
...
Рейтинг: 0 / 0
11.01.2005, 16:10:17
    #32859558
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пустой RecordSet
_bobне надо ля-ля, время выполнения .count линейно зависит от числа записей в рекордсете и может составлять десятки секунд на очень быстрой машине, а время .bof and .eof - от числа записей не зависит
------------------
Best regards, _bob

Десятки секунд буду только в случае сотен тысяч записей, такого времени я еще в жизни не встречал. Это будет означать только кривой дизайн.
RеcordCount - свойство. Т.е. если рекордсет уже на клиенте, то он уже посчитан и возврат свойства занимает миллисекунды. Время может увеличиваться если большой рекордсет не был полностью вытащен, в этом случае для подсчет нужен полный фетч. Задержка идет на открытии а не на подсчете.
Но, для проверки на ПУСТОЙ рекордсет конечно нужно использовать EOF и BOF.
...
Рейтинг: 0 / 0
11.01.2005, 17:34:57
    #32859836
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пустой RecordSet
На связанном рекордсете может и будет сравнимо с десятками секунд,
особенно когда полей штук 50 и записей тысяч 300, а отображет его грид на весь экран 1600x1280.
на его свободном клоне это время на два порядка меньше.
...
Рейтинг: 0 / 0
16.01.2005, 11:58:40
    #32866647
Andrey13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пустой RecordSet
Magnus23Конечно не всякий, от типа курсора зависит. Инфы о типе и расположении курсора не было, поэтому угадывать я не буду.

Magnus

Прошу прощения, даже не знал об этом.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Пустой RecordSet / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]