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

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



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

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

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

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

RedCatXНо однако, SQL хранит таблицы ключей, неужели к ним никак нельзя получить доступ в пределах курсора?Можно конечно. SQLGetData(stmt, номер_колонки_с_ключом, ...).
...
Рейтинг: 0 / 0
ODBC: Поиск по первичному ключу внутри курсора
    #38897745
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 не поддерживатеся.
...
Рейтинг: 0 / 0
ODBC: Поиск по первичному ключу внутри курсора
    #38897746
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RedCatXWhite OwlНамного проще и надежнее делать отдельные запросы с малым количеством возвращаемых строк.
Увы, но SQL не предоставляет возможности передвигаться по всей таблице с помощью функций вида GetNext/GetPrev иначе как с помощью курсора...

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

Вы не путайте хранение и курсор.
Результат выполения select никакого отношения к хранению не имеет.
результат запраса может быть собран из 10 таблиц хранязихся на 5 разных серверах..
...
Рейтинг: 0 / 0
ODBC: Поиск по первичному ключу внутри курсора
    #38897752
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
ODBC: Поиск по первичному ключу внутри курсора
    #38897806
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще, понятие "курсор" только в рамках технологий, связанных с СУБД имеет три разных значения.
...
Рейтинг: 0 / 0
ODBC: Поиск по первичному ключу внутри курсора
    #38897808
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RedCatXДоброго времени суток!

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

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

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


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

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


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

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

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

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


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