Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / ODBC: Поиск по первичному ключу внутри курсора / 22 сообщений из 22, страница 1 из 1
06.03.2015, 23:34
    #38897713
RedCatX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODBC: Поиск по первичному ключу внутри курсора
Доброго времени суток!

Возникла такая проблема: я создаю динамический курсор по запросу вида "SELECT * FROM table ORDER BY col_name, id", и мне нужно установить курсор на строку, где id (первичный ключ) равен N. Извлечь эту строку сразу ("SELECT ... WHERE id = N") невозможно, так как нужно сохранить возможность перемещаться назад-вперед по всей таблице, просто начальной позицией нужно сделать определенную строку как я писал выше. Возможно ли это реализовать с помощью ODBC?
Заранее спасибо!
...
Рейтинг: 0 / 0
07.03.2015, 00:00
    #38897729
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODBC: Поиск по первичному ключу внутри курсора
Никогда не понимал в чем смысл динамических курсоров. Намного проще и надежнее делать отдельные запросы с малым количеством возвращаемых строк.



Но если очень хочется, то смотри в сторону "закладок". В теории, это работает так:
Когда ты еще только создаешь клиентский курсор, ставишь ему атрибут SQL_ATTR_USE_BOOKMARK. Потом уже посылаешь свое "select * from table". Тогда у курсора в нулевой колонке будет хранится уникальное значение (сгенерированное самим ODBC). Ты сможешь его читать через SQLGetData(stmt, 0, ....). А уже зная какой уникальный номер получила та или иная строка курсора, можно будет на них быстро прыгать через SQLFetchScroll(SQL_FETCH_BOOKMARK).
И нет, задать самому чтобы закладка равнялась полю ID нельзя. Тебе придется сначала пробежать по всему курсору и составить словарь "#закладки<=>ID".
Сам я такое извращение не делал, так что тонкостей не расскажу.

Да и работать это будет далеко не везде. Не все СУБД позволяют свободное хождение по курсору. А те которые позволяют, часто оставляют в DNS возможность запрета таких курсоров. Так что ты сильно рискуешь...
...
Рейтинг: 0 / 0
07.03.2015, 00:09
    #38897731
RedCatX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODBC: Поиск по первичному ключу внутри курсора
White OwlНамного проще и надежнее делать отдельные запросы с малым количеством возвращаемых строк.
Увы, но SQL не предоставляет возможности передвигаться по всей таблице с помощью функций вида GetNext/GetPrev иначе как с помощью курсора...

Но однако, SQL хранит таблицы ключей, неужели к ним никак нельзя получить доступ в пределах курсора?
...
Рейтинг: 0 / 0
07.03.2015, 00:17
    #38897735
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODBC: Поиск по первичному ключу внутри курсора
RedCatXWhite OwlНамного проще и надежнее делать отдельные запросы с малым количеством возвращаемых строк.
Увы, но SQL не предоставляет возможности передвигаться по всей таблице с помощью функций вида GetNext/GetPrev иначе как с помощью курсора... Нет ни одной задачи которая требовала бы передвигаться по всей таблице.
Вообще, нет таких задач на свете.
Все что нужно, прекрасно и более надежно решается через "select ... where id=?" и "update ... where id=?".

Клиентские курсоры это изначально дурная идея. С точки зрения клиента это плохо потому что ненадежно. Сеть глюканула - курсор поломался, все что пользователь изменял в этом курсоре ухнуло в никуда. А с точки зрения сервера, такие курсоры требуют долгоживущих транзакций, что в свою очередь может привести к коллизиям, либо потребует выключения изоляции. Что в обоих случаях хреново.

RedCatXНо однако, SQL хранит таблицы ключей, неужели к ним никак нельзя получить доступ в пределах курсора?Можно конечно. SQLGetData(stmt, номер_колонки_с_ключом, ...).
...
Рейтинг: 0 / 0
07.03.2015, 01:14
    #38897745
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODBC: Поиск по первичному ключу внутри курсора
RedCatXДоброго времени суток!

Возникла такая проблема: я создаю динамический курсор по запросу вида "SELECT * FROM table ORDER BY col_name, id", и мне нужно установить курсор на строку, где id (первичный ключ) равен N. Извлечь эту строку сразу ("SELECT ... WHERE id = N") невозможно, так как нужно сохранить возможность перемещаться назад-вперед по всей таблице, просто начальной позицией нужно сделать определенную строку как я писал выше. Возможно ли это реализовать с помощью ODBC?
Заранее спасибо!

это офтопик
опция называется
Scrollable cursorsDECLARE cursor_name sensitivity SCROLL CURSOR FOR SELECT ... FROM ...

и поддерживается всеми СУБД.

Вероятнее всего в ODBC не поддерживатеся.
...
Рейтинг: 0 / 0
07.03.2015, 01:19
    #38897746
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODBC: Поиск по первичному ключу внутри курсора
RedCatXWhite OwlНамного проще и надежнее делать отдельные запросы с малым количеством возвращаемых строк.
Увы, но SQL не предоставляет возможности передвигаться по всей таблице с помощью функций вида GetNext/GetPrev иначе как с помощью курсора...

Но однако, SQL хранит таблицы ключей, неужели к ним никак нельзя получить доступ в пределах курсора?

Вы не путайте хранение и курсор.
Результат выполения select никакого отношения к хранению не имеет.
результат запраса может быть собран из 10 таблиц хранязихся на 5 разных серверах..
...
Рейтинг: 0 / 0
07.03.2015, 02:15
    #38897752
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODBC: Поиск по первичному ключу внутри курсора
onstat-RedCatXДоброго времени суток!

Возникла такая проблема: я создаю динамический курсор по запросу вида "SELECT * FROM table ORDER BY col_name, id", и мне нужно установить курсор на строку, где id (первичный ключ) равен N. Извлечь эту строку сразу ("SELECT ... WHERE id = N") невозможно, так как нужно сохранить возможность перемещаться назад-вперед по всей таблице, просто начальной позицией нужно сделать определенную строку как я писал выше. Возможно ли это реализовать с помощью ODBC?
Заранее спасибо!

это офтопик
опция называется
Scrollable cursorsDECLARE cursor_name sensitivity SCROLL CURSOR FOR SELECT ... FROM ...

и поддерживается всеми СУБД.

Вероятнее всего в ODBC не поддерживатеся.Ты путаешь серверные курсоры и клиентские.
Те о которых ту думаешь это серверные, и они действительно офтопик (и кстати далеко не все СУБД умеют делать SCROLL курсоры).

А клиентские курсоры о которых говорит RedCatX это совершенно отдельный вид курсора, практически разделенный на две части - один виртуальный курсор на сервере, а все управление и fetch из него делается на клиенте. Эти курсоры тоже могут быть как одно-направленными, так и свободно бегающими. И это тоже зависит от СУБД и поддерживается не везде.
...
Рейтинг: 0 / 0
07.03.2015, 10:05
    #38897806
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODBC: Поиск по первичному ключу внутри курсора
вообще, понятие "курсор" только в рамках технологий, связанных с СУБД имеет три разных значения.
...
Рейтинг: 0 / 0
07.03.2015, 10:11
    #38897808
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODBC: Поиск по первичному ключу внутри курсора
RedCatXДоброго времени суток!

Возникла такая проблема: я создаю динамический курсор по запросу вида "SELECT * FROM table ORDER BY col_name, id", и мне нужно установить курсор на строку, где id (первичный ключ) равен N. Извлечь эту строку сразу ("SELECT ... WHERE id = N") невозможно, так как нужно сохранить возможность перемещаться назад-вперед по всей таблице, просто начальной позицией нужно сделать определенную строку как я писал выше. Возможно ли это реализовать с помощью ODBC?
Заранее спасибо!

ты лучше расскажи, зачем это тебе нужно, а мы может быть тебе тогда скажем, как это надо делать.
...
Рейтинг: 0 / 0
07.03.2015, 21:58
    #38898069
RedCatX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODBC: Поиск по первичному ключу внутри курсора
MasterZivты лучше расскажи, зачем это тебе нужно, а мы может быть тебе тогда скажем, как это надо делать.

Есть старое приложение (без исходников) работающее с базой данных Btrieve. Нужно перевести это приложение с Btrieve на MS SQL Server, но исходников нет, переписывать с нуля - не вариант, остается один выход: создать мегакостыль транслирующий вызовы Btrieve в SQL. Этим я и занимаюсь. А функции вида GetNext/GetPrev позволяющие обходить весь файл (таблицу в SQL) - основа Btrieve.
...
Рейтинг: 0 / 0
07.03.2015, 22:15
    #38898081
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODBC: Поиск по первичному ключу внутри курсора
RedCatXостается один выход: создать мегакостыль транслирующий вызовы Btrieve в SQL.
Этим я и занимаюсь. А функции вида GetNext/GetPrev позволяющие обходить весь файл (таблицу
в SQL) - основа Btrieve.
Тогда не парься с курсорами, а тупо вычитывай результат запроса в массив и уже в нём
навигуйся хоть до позеленения.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
07.03.2015, 22:33
    #38898092
RedCatX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODBC: Поиск по первичному ключу внутри курсора
Dimitry SibiryakovRedCatXостается один выход: создать мегакостыль транслирующий вызовы Btrieve в SQL.
Этим я и занимаюсь. А функции вида GetNext/GetPrev позволяющие обходить весь файл (таблицу
в SQL) - основа Btrieve.
Тогда не парься с курсорами, а тупо вычитывай результат запроса в массив и уже в нём
навигуйся хоть до позеленения.


Если таблица большая, то такое вычитывание может занять много времени и много памяти. А еще, та программа сделана так, что если в течение секунды после открытия файла не получит данные, то намертво зависнет.
...
Рейтинг: 0 / 0
07.03.2015, 22:40
    #38898099
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODBC: Поиск по первичному ключу внутри курсора
RedCatXНужно перевести это приложение с Btrieve на MS SQL Server, но исходников нет, переписывать с нуля - не вариант, остается один выход: создать мегакостыль транслирующий вызовы Btrieve в SQL.
подменой wbtrv32.dll ?
...
Рейтинг: 0 / 0
07.03.2015, 22:53
    #38898106
RedCatX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODBC: Поиск по первичному ключу внутри курсора
Изопропилподменой wbtrv32.dll ?
Да.
...
Рейтинг: 0 / 0
07.03.2015, 23:06
    #38898115
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODBC: Поиск по первичному ключу внутри курсора
...
Рейтинг: 0 / 0
08.03.2015, 00:45
    #38898173
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODBC: Поиск по первичному ключу внутри курсора
RedCatXDimitry Sibiryakovпропущено...

Тогда не парься с курсорами, а тупо вычитывай результат запроса в массив и уже в нём
навигуйся хоть до позеленения.


Если таблица большая, то такое вычитывание может занять много времени и много памяти. А еще, та программа сделана так, что если в течение секунды после открытия файла не получит данные, то намертво зависнет.Ну.... я бы все-же не извращался, а занялся бы или поиском альтернативы, либо написал бы аналог с нуля. В итоге это будет проще.
...
Рейтинг: 0 / 0
08.03.2015, 00:46
    #38898174
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODBC: Поиск по первичному ключу внутри курсора
Изопропилкой какие идеи - https://msdn.microsoft.com/en-us/library/ms715420(v=vs.85).aspx

я чувствую, ты в теме...
...
Рейтинг: 0 / 0
08.03.2015, 00:51
    #38898176
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODBC: Поиск по первичному ключу внутри курсора
RedCatX,

имитируй все тогда в посрочном режиме.
задавай какой то порядок на строках таблицы, и построчно каждую запись вычитывай из бд.
...
Рейтинг: 0 / 0
08.03.2015, 01:04
    #38898180
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODBC: Поиск по первичному ключу внутри курсора
RedCatXЕсть старое приложение (без исходников) работающее с базой данных Btrieveсочувствую, чё. Жуткая жуть
...
Рейтинг: 0 / 0
08.03.2015, 13:37
    #38898359
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODBC: Поиск по первичному ключу внутри курсора
MasterZivя чувствую, ты в теме...
к счастью - нет
...
Рейтинг: 0 / 0
08.03.2015, 14:30
    #38898389
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODBC: Поиск по первичному ключу внутри курсора
RedCatXMasterZivты лучше расскажи, зачем это тебе нужно, а мы может быть тебе тогда скажем, как это надо делать.

Есть старое приложение (без исходников) работающее с базой данных Btrieve. Нужно перевести это приложение с Btrieve на MS SQL Server, но исходников нет, переписывать с нуля - не вариант, остается один выход: создать мегакостыль транслирующий вызовы Btrieve в SQL. Этим я и занимаюсь. А функции вида GetNext/GetPrev позволяющие обходить весь файл (таблицу в SQL) - основа Btrieve.
Хрень тормозная получится. Ты пытаешься файл-сервер заменить клиент-сервером. Без смены архитектуры приложения это невозможно. Плюсы того что есть потеряешь, а плюсы MS SQL использовать не сможешь.
...
Рейтинг: 0 / 0
08.03.2015, 14:41
    #38898397
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODBC: Поиск по первичному ключу внутри курсора
Цель переселения базы на MSSQL какая? Если прогу переписывать не хочешь, значит она устраивает, что тогда не устраивает? Может другие пути решения поискать?
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / ODBC: Поиск по первичному ключу внутри курсора / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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