|
|
|
работа через ODBC c Oracle
|
|||
|---|---|---|---|
|
#18+
Привет всем. Мне нужно записать в таблицу данные.На момент когда я их записываю никто не должен ни читать эту таблицу ни писать в нее, т.к. чтобы залить в нее данные нужно определить масимальное значение пакета в поле BT. В начале транзакции определяется максимальный номер по полю BT, все ячейки поля BT добавляемого набора записей приниают значение max(BT) + 1. Проблема в том что с программой которую я пишу будут работать несколько человек. И возникает вопрос: Как можно в Си++ через ODBC открыть таблицу с монопольным доступом? Такое вообще возможно? Си я недавно начал учить.С Oracle вообще никогда не работал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 12:02 |
|
||
|
работа через ODBC c Oracle
|
|||
|---|---|---|---|
|
#18+
|\/|AXМне нужно записать в таблицу данные.На момент когда я их записываю никто не должен ни читать эту таблицу ни писать в нее, т.к. чтобы залить в нее данные нужно определить масимальное значение пакета в поле BT. В начале транзакции определяется максимальный номер по полю BT, все ячейки поля BT добавляемого набора записей приниают значение max(BT) + 1. Проблема в том что с программой которую я пишу будут работать несколько человек. И возникает вопрос: Как можно в Си++ через ODBC открыть таблицу с монопольным доступом? Такое вообще возможно? Си я недавно начал учить.С Oracle вообще никогда не работал. Для доступа к любой БД используют ADO (ODBC - это ниже уровень, кодировать придется больше), есть провайдеры для ORACLE (и есть драйвер ODBC). То как ты описываешь поле BT - это автоинкрементное поле, встроенный тип данных. По поводу блокировки БД при INSERT, UPDATE И т.д., это не забота клиента, это забота сервера (СУБД) и он же оповещает клиентов в случае необходимости, что-то у себя обновить. Вообще логично почитать о клиент-серверной архитектуре. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 12:29 |
|
||
|
работа через ODBC c Oracle
|
|||
|---|---|---|---|
|
#18+
pandrew Для доступа к любой БД используют ADO (ODBC - это ниже уровень, кодировать придется больше), есть провайдеры для ORACLE (и есть драйвер ODBC). То как ты описываешь поле BT - это автоинкрементное поле, встроенный тип данных. По поводу блокировки БД при INSERT, UPDATE И т.д., это не забота клиента, это забота сервера (СУБД) и он же оповещает клиентов в случае необходимости, что-то у себя обновить. Вообще логично почитать о клиент-серверной архитектуре. Условие стоит на использовании только ODBC. Поле не AutoInc. У него вообще строковый тип. правда не знаю зачем так сделали. Поэтому то и приходится сначала максимальное значение брать, а потом уже все заносить. В их случае SELECT MAX(BT) уже не подходит. У меня практика. Была б моя воля я бы им все переделал. А данные я забиваю не INSERT'ом, а CRecordset::AddNew. С помощью DoFieldExchange. Чтоб глюков мньше было, так контролировать проще. Поэтому то я и спрашиваю как открыть табу монопольно? Чтоб не получилось что два человека занесут данные с одним номером пакета. Да и читать сейчас безсмысленно. Есть ограничение на время. Один плюс в задаче - это мое первое знакомство с Си. Вот пример: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 13:28 |
|
||
|
работа через ODBC c Oracle
|
|||
|---|---|---|---|
|
#18+
|\/|AXПривет всем. Мне нужно записать в таблицу данные.На момент когда я их записываю никто не должен ни читать эту таблицу ни писать в нее, т.к. чтобы залить в нее данные нужно определить масимальное значение пакета в поле BT. В начале транзакции определяется максимальный номер по полю BT, все ячейки поля BT добавляемого набора записей приниают значение max(BT) + 1. Проблема в том что с программой которую я пишу будут работать несколько человек. И возникает вопрос: Как можно в Си++ через ODBC открыть таблицу с монопольным доступом? Такое вообще возможно? Си я недавно начал учить.С Oracle вообще никогда не работал. Сначала надо изучить предмет, с которым работаешь... Хотя бы спросить у "стариков", поработавших с Oracle... А то можно такого натворить... :) Насколько я понял, Вы раньше работали исключительно с файловыми структурами, поэтому и говорите о блокировании ввода. В данном случае, я бы сделал: вариант 1 (оптимальный): 1. сделать последовательность (sequence) и использовать значение при вводе записей. Каждый юзер будет обращаться к единой sequence и получать необходимый "номер" при помощи <имя sequence>.nextval 2. уже это значение вводить требуемое поле И не надо городить огород на пустом месте... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 13:50 |
|
||
|
работа через ODBC c Oracle
|
|||
|---|---|---|---|
|
#18+
Станислав С Сначала надо изучить предмет, с которым работаешь... Хотя бы спросить у "стариков", поработавших с Oracle... А то можно такого натворить... :) Насколько я понял, Вы раньше работали исключительно с файловыми структурами, поэтому и говорите о блокировании ввода. В данном случае, я бы сделал: вариант 1 (оптимальный): 1. сделать последовательность (sequence) и использовать значение при вводе записей. Каждый юзер будет обращаться к единой sequence и получать необходимый "номер" при помощи <имя sequence>.nextval 2. уже это значение вводить требуемое поле И не надо городить огород на пустом месте... Блин, блин, блин. Есть возможность из Си открыть таблицу монопольно на пять секунд пока идет запись в нее или нет? Я открываю Базу через ODBC и чтобы работать с ней есть CDatabase и CRecordset, в которых предусмотрена возможность записи, добавления и т.д. вы это лучше меня знаете и работа с ними не требует особого знания конкретной БД, со всеми она одинакова. Одни и те же функции, переменные. Я не ковыряюсь в Oracle. я лишь записываю данные в нее посредством моей проги. Общее представление о базах и СУБД и все такое прочее у меня есть. Вы только ответьте мне на вопрос, потому что мне никто не даст делать секвенсы и т.д. Я на практике. Я работал с СУБД, но вся моя работа ограничивалась рамками CREATE,ALTER,INSERT,SELECT и т.д., но я не такой дурачек чтобы дров наколоть. Осторожность прежде всего. И если создание последовательности единственный наилучший путь, то где можно подчерпнуть знаний о ней? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 14:27 |
|
||
|
работа через ODBC c Oracle
|
|||
|---|---|---|---|
|
#18+
Почитать про последовательности можно здесь . Скорее всего, прав на создание последовательности у вас нет, придется просить об этом админов или разработчиков из штата. Уверен, что они отнесутся с пониманием к такой просьбе. Пытаться получить уникальный ключ таким образом, как вы хотели изначально, не стоит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 14:49 |
|
||
|
работа через ODBC c Oracle
|
|||
|---|---|---|---|
|
#18+
|\/|AXБлин, блин, блин. Есть возможность из Си открыть таблицу монопольно на пять секунд пока идет запись в нее или нет? Я открываю Базу через ODBC и чтобы работать с ней есть CDatabase и CRecordset, в которых предусмотрена возможность записи, добавления и т.д. вы это лучше меня знаете и работа с ними не требует особого знания конкретной БД, со всеми она одинакова. Одни и те же функции, переменные. Я не ковыряюсь в Oracle. я лишь записываю данные в нее посредством моей проги. Общее представление о базах и СУБД и все такое прочее у меня есть. Вы только ответьте мне на вопрос, потому что мне никто не даст делать секвенсы и т.д. Я на практике. Я работал с СУБД, но вся моя работа ограничивалась рамками CREATE,ALTER,INSERT,SELECT и т.д., но я не такой дурачек чтобы дров наколоть. Осторожность прежде всего. И если создание последовательности единственный наилучший путь, то где можно подчерпнуть знаний о ней? Ну почему же... Можно открыть таблицу в монопольном режиме: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 15:07 |
|
||
|
работа через ODBC c Oracle
|
|||
|---|---|---|---|
|
#18+
Станислав СНо в контексте решения конкретной задачи - это не поможет... Так что sequence - единственное верное решение, позволяющее получить уникальное значение в требуемое поле... Хе-хе. ТАк зачем же тянешь? Кинь мне уже ссылку на инфу как это все реализовать(если есть конечно), чтобы я отстал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 15:16 |
|
||
|
работа через ODBC c Oracle
|
|||
|---|---|---|---|
|
#18+
|\/|AX Станислав СНо в контексте решения конкретной задачи - это не поможет... Так что sequence - единственное верное решение, позволяющее получить уникальное значение в требуемое поле... Хе-хе. ТАк зачем же тянешь? Кинь мне уже ссылку на инфу как это все реализовать(если есть конечно), чтобы я отстал. Уже сказали: IMil Почитать про последовательности можно здесь . Там же можно почитать по "ручным" блокировкам таблицы... Кроме того, обратите внимание на это: IMil Скорее всего, прав на создание последовательности у вас нет, придется просить об этом админов или разработчиков из штата. Уверен, что они отнесутся с пониманием к такой просьбе. Пытаться получить уникальный ключ таким образом, как вы хотели изначально, не стоит. От себя замечу, что поскольку блокировать чтение данных из таблицы Вы все-равно не сможете (а значит не обеспечите уникальность значения в поле; и дело тут не в С++, а в идеологии работы промышленной СУБД (Oracle)), то остается только один 99,9999% надежный путь - использовать последовательности (sequences)... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 15:35 |
|
||
|
работа через ODBC c Oracle
|
|||
|---|---|---|---|
|
#18+
Спасибо большое. Я-то конечно заниматься ими(sequence'ами) и не собирался. Есть админы, но мне надо иметь о них представление чтобы четко и ясно им объяснить что я хочу. Кстати, я уже писал, поле текстовое. С этим проблем не будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 15:43 |
|
||
|
работа через ODBC c Oracle
|
|||
|---|---|---|---|
|
#18+
|\/|AXСпасибо большое. Я-то конечно заниматься ими(sequence'ами) и не собирался. Есть админы, но мне надо иметь о них представление чтобы четко и ясно им объяснить что я хочу. Кстати, я уже писал, поле текстовое. С этим проблем не будет? Оракл САМ осуществляет перевод "строка"<-->"число" исходя из контекста (тип поля, тип передаваемых данных, тип операции (+ для числовых данных или || для символьных)). Только в преобразуемом представлении должно быть именно число (набор цифр). Но если Вы хотите быть на 100% уверены в результате, то можно использовать функции явного преобразования: to_char() и to_number(). Например: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 15:56 |
|
||
|
работа через ODBC c Oracle
|
|||
|---|---|---|---|
|
#18+
Эврика! Мне яблоко на голову упало. Почитал малость. Оказывается ничего сложного. Надо попросить пойти. Пусть сделают. Еще вопрос назрел. А как мне ее получить в мою программу. Такой запрос допустим: Код: plaintext Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 16:15 |
|
||
|
работа через ODBC c Oracle
|
|||
|---|---|---|---|
|
#18+
|\/|AXСпасибо большое. Я-то конечно заниматься ими(sequence'ами) и не собирался. Есть админы, но мне надо иметь о них представление чтобы четко и ясно им объяснить что я хочу. Кстати, я уже писал, поле текстовое. С этим проблем не будет? Будут, но не тривиальные. С оценкой кардинальности на выборках по диапазонам. читать здесь если интересно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 16:23 |
|
||
|
работа через ODBC c Oracle
|
|||
|---|---|---|---|
|
#18+
|\/|AXЭврика! Мне яблоко на голову упало. Почитал малость. Оказывается ничего сложного. Надо попросить пойти. Пусть сделают. Еще вопрос назрел. А как мне ее получить в мою программу. Такой запрос допустим: Код: plaintext Код: plaintext 1. 2. 3. Нет, так нельзя. Последовательность не привязывается к таблице - она привязывается к схеме пользователя. Но в Oracle есть псевдо-таблица dual . Тогда получение очередного значения из последовательности будет иметь вид: Код: plaintext Хотя это все-таки получше будет: автор Или надо так: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 16:25 |
|
||
|
работа через ODBC c Oracle
|
|||
|---|---|---|---|
|
#18+
|\/|AX Код: plaintext из dual можно дергать, там ГАРАНТИРОВАННО одна запись. еще currval, после nextval имеется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 16:26 |
|
||
|
работа через ODBC c Oracle
|
|||
|---|---|---|---|
|
#18+
|\/|AX Код: plaintext 1. 2. 3. Если ли в даном случае уверенность в том, что значение sequence никто не изменит во время выполения 2-4 строчек вставки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 16:32 |
|
||
|
работа через ODBC c Oracle
|
|||
|---|---|---|---|
|
#18+
Станислав С <схема> - пользователь, создавший последовательность. Я обращаюсь к таблицам так: DTA . table. Надо понимать что DTA есть схема,т.е. оунер? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 16:36 |
|
||
|
работа через ODBC c Oracle
|
|||
|---|---|---|---|
|
#18+
Lexogen Если ли в даном случае уверенность в том, что значение sequence никто не изменит во время выполения 2-4 строчек вставки?Это как раз и есть тема дня. Только обратил внимание. А потом бы думал в чем может быть проблема. Спасибо. Значит лучше в переменную брать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 16:38 |
|
||
|
работа через ODBC c Oracle
|
|||
|---|---|---|---|
|
#18+
Lexogen |\/|AX Код: plaintext 1. 2. 3. Если ли в даном случае уверенность в том, что значение sequence никто не изменит во время выполения 2-4 строчек вставки? Документация Oracle When you create a sequence, you can define its initial value and the increment between its values. The first reference to NEXTVAL returns the sequence's initial value. Subsequent references to NEXTVAL increment the sequence value by the defined increment and return the new value. Any reference to CURRVAL always returns the sequence's current value, which is the value returned by the last reference to NEXTVAL. Note that before you use CURRVAL for a sequence in your session, you must first initialize the sequence with NEXTVAL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 16:39 |
|
||
|
работа через ODBC c Oracle
|
|||
|---|---|---|---|
|
#18+
|\/|AX Станислав С <схема> - пользователь, создавший последовательность. Я обращаюсь к таблицам так: DTA . table. Надо понимать что DTA есть схема,т.е. оунер? да. А вообще-то это форум по С++, а не ораклу. Для Оракла есть другая ветка... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 16:42 |
|
||
|
работа через ODBC c Oracle
|
|||
|---|---|---|---|
|
#18+
Документация Oracle When you create a sequence, you can define its initial value and the increment between its values. The first reference to NEXTVAL returns the sequence's initial value. Subsequent references to NEXTVAL increment the sequence value by the defined increment and return the new value. Any reference to CURRVAL always returns the sequence's current value, which is the value returned by the last reference to NEXTVAL. Note that before you use CURRVAL for a sequence in your session, you must first initialize the sequence with NEXTVAL. И это независимо от того что еще кто-то может послать запрос nextval? Может же быть и такой вариант: Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 16:45 |
|
||
|
работа через ODBC c Oracle
|
|||
|---|---|---|---|
|
#18+
|\/|AX Документация Oracle When you create a sequence, you can define its initial value and the increment between its values. The first reference to NEXTVAL returns the sequence's initial value. Subsequent references to NEXTVAL increment the sequence value by the defined increment and return the new value. Any reference to CURRVAL always returns the sequence's current value, which is the value returned by the last reference to NEXTVAL. Note that before you use CURRVAL for a sequence in your session, you must first initialize the sequence with NEXTVAL. И это независимо от того что еще кто-то может послать запрос nextval? Может же быть и такой вариант: Код: plaintext 1. 2. 3. 4. 5. 6. Как Вы читали? Вот же фрагмент: Объяснение с рекомендованного сайта После того как очередной номер последовательности сгенерирован, этот номер доступен лишь сессии, сгенерировавшей его. Независимо от подтверждения или отката транзакций, все пользователи, обращающиеся к ORDER_SEQ.NEXTVAL, получают уникальные значения. Поэтому, если несколько пользователей одновременно обращаются к одной и той же последовательности, каждый из них может получать номера этой последовательности с промежутками, потому что номера генерируются также другими пользователями. То есть, пока в той же транзакции снова не обратишься к nextval - будешь получать одни и те же значения через currval! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 16:50 |
|
||
|
работа через ODBC c Oracle
|
|||
|---|---|---|---|
|
#18+
Да я сам и не заметил как увлекся. Вообще-то это не я начал. Я-то всего лишь хотел узнать можно ли в Си табличку открыть по особому, но разговор перешел в другое русло. Ну ладно. Ничего плохого в этом нет. Спасибо за помощь. Буду эксперементировать с вариантами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 16:50 |
|
||
|
работа через ODBC c Oracle
|
|||
|---|---|---|---|
|
#18+
Станислав СКак Вы читали? Объяснение с рекомендованного сайта После того как очередной номер последовательности сгенерирован, этот номер доступен лишь сессии, сгенерировавшей его. Независимо от подтверждения или отката транзакций, все пользователи, обращающиеся к ORDER_SEQ.NEXTVAL, получают уникальные значения. Поэтому, если несколько пользователей одновременно обращаются к одной и той же последовательности, каждый из них может получать номера этой последовательности с промежутками, потому что номера генерируются также другими пользователями. То есть, пока в той же транзакции снова не обратишься к nextval - будешь получать одни и те же значения через currval!Извиняюсь за вопрос. Конец рабочего дня. Уже голова совсем не работает. Читал по диагонали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 16:54 |
|
||
|
работа через ODBC c Oracle
|
|||
|---|---|---|---|
|
#18+
3.14сец! Начальница боится сиквенсов. Придется блокировать таблицу на время записи. Сейчас был длинный диалог. И что мне не говорите, а лучший вариант блокировка. Я по себе знаю. Это допустимый вариант? Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2007, 17:54 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=306&tid=2029333]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
| others: | 252ms |
| total: | 403ms |

| 0 / 0 |
