Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как выбрать базу данных? подключаюсь чесез OCI 
:(
    Опции темы
dershokus
Дата 10.8.2012, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 7.8.2011

Репутация: нет
Всего: 1



 Здравствуйте... снова.
 Использую OCI + VC++. Оракул незнаю вообще, но пытаюсь изучать. Я сделал подключение, все работает и даже нормально выполяются запросы, но! У меня, конечно, EX т.е. одна база ограниченная 12ГБ, там нет возможности создать и значит выбрать базу данных. Но в нормальных версиях ведь можно, значит должна быть какая-то возможность выбрать базу через OCI с которой мне работать.
 Может я не понимаю чего-то принципиального в методе работы с Oracle? Может там на каждую базу выделяется отдельный порт или SID (что это такое я тоже слабо понимаю)?
 В общем, как мне выбрать базу данных с которой работать?
PM MAIL   Вверх
borisbn
Дата 13.8.2012, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: нет
Всего: 135



Если я правильно понял, то выбор БД в оракуле делается так:
в файле
Цитата
%ORACLE_CLIENT_PATH%\network\ADMIN\tnsnames.ora

где %ORACLE_CLIENT_PATH% - путь к установленному клиенту (обычно - c:\oracle\product\10.2.0\client_1)
для каждой БД добавляются такие строки

Цитата
DB_ALIAS =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = name_of_service)
    )
  )

а затем в строке подключения к БД указывается
Цитата
Provider=OraOLEDB.Oracle.1;Password=pass;Persist Security Info=True;User ID=user_name;Data Source=DB_ALIAS

понятное дело, что 192.168.1.1, user_name и pass нужно заменить на свои  smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
dershokus
Дата 13.8.2012, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 7.8.2011

Репутация: нет
Всего: 1



Спасибо. Файл tnsnames.ora нашел. Вот только я не через OLEDB подключаюсь. Интересен OCI...
PM MAIL   Вверх
borisbn
Дата 13.8.2012, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: нет
Всего: 135



Цитата(dershokus @  13.8.2012,  11:49 Найти цитируемый пост)
Вот только я не через OLEDB подключаюсь. Интересен OCI...

По идее, поменяется только параметр Provider, но я не уверен

Добавлено через 1 минуту и 41 секунду
посмотри здесь - http://www.connectionstrings.com/oracle может чего-нить поможет


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
dershokus
Дата 13.8.2012, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 7.8.2011

Репутация: нет
Всего: 1



Сейчас использую OCILogon и он мне выдает
Цитата

ORA-12154: TNS:could not resolve the connect identifier specified

 имя базы я использую "xe"
мой tnsnames.ora
Цитата

XE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = test.home)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )

EXTPROC_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
    )
    (CONNECT_DATA =
      (SID = PLSExtProc)
      (PRESENTATION = RO)
    )
  )

ORACLR_CONNECTION_DATA = 
  (DESCRIPTION = 
    (ADDRESS_LIST = 
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1)) 
    ) 
    (CONNECT_DATA = 
      (SID = CLRExtProc) 
      (PRESENTATION = RO) 
    ) 
  ) 


PM MAIL   Вверх
borisbn
Дата 13.8.2012, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: нет
Всего: 135



что пишет на
Цитата
ping test.home

?
Если всё норм., то попробуй подключиться к своей базе XE стандартными средствами оракула.

Добавлено через 2 минуты и 22 секунды
вот ещё почитай - http://ora-12154.ora-code.com/



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
leniviy
Дата 13.8.2012, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



В отличие от юзера и пароля база выбирается функцией OCIServerAttach()
У меня работает вот такой код:
Код

/*---------------------------------------------------------------------------
                     PRIVATE TYPES AND CONSTANTS
  ---------------------------------------------------------------------------*/
static text *username = (text *) "scott";
static text *password = (text *) "tiger";
static text *tnsname =  (text *) "PPB";
...
  if (OCIHandleAlloc((dvoid *) ctxptr->envhp, (dvoid **) &ctxptr->authp,
                     (ub4) OCI_HTYPE_SESSION, (size_t) 0, (dvoid **) 0))
    printf("FAILED: OCIHandleAlloc() on ctxptr->authp\n"); 
  
  if (OCIServerAttach(ctxptr->srvhp, ctxptr->errhp, (text *) tnsname,
                      (sb4) strlen((char *) tnsname), (ub4) OCI_DEFAULT))
    printf("FAILED: OCIServerAttach()\n");

  if (OCIAttrSet((dvoid *) ctxptr->svchp, (ub4) OCI_HTYPE_SVCCTX,
                 (dvoid *) ctxptr->srvhp, (ub4) 0, (ub4) OCI_ATTR_SERVER,
                 ctxptr->errhp))
    printf("FAILED: OCIAttrSet() server attribute\n");
    
  
  /*begin log_on part */
                    
  if (OCIAttrSet((dvoid *) ctxptr->authp, (ub4) OCI_HTYPE_SESSION,
                 (dvoid *) username, (ub4) strlen((char *) username),
                 (ub4) OCI_ATTR_USERNAME, ctxptr->errhp))
    printf("FAILED: OCIAttrSet() userid\n"); 
  
  if (OCIAttrSet((dvoid *) ctxptr->authp, (ub4) OCI_HTYPE_SESSION,
                 (dvoid *) password, (ub4) strlen((char *) password),
                 (ub4) OCI_ATTR_PASSWORD, ctxptr->errhp))
    printf("FAILED: OCIAttrSet() passwd\n");                                
...


Это сообщение отредактировал(а) leniviy - 13.8.2012, 21:35

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  cdemoanydata.zip 7,25 Kb
PM MAIL   Вверх
dershokus
Дата 14.8.2012, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 7.8.2011

Репутация: нет
Всего: 1



Всем спасибо. Расследование показало что есть такие функции:
Код

sword OCILogon ( OCIEnv *envhp,
   OCIError *errhp,
   OCISvcCtx **svchp,
   CONST OraText *username,
   ub4 uname_len,
   CONST OraText *password,
   ub4 passwd_len,
   CONST OraText *dbname,
   ub4 dbname_len );
sword OCILogon2 ( OCIEnv *envhp,
   ...
   ub4 mode );
sword OCISessionGet ( OCIenv *envhp,
   OCIError *errhp,
   OCISvcCtx **svchp,
   OCIAuthInfo *authInfop,
   OraText *dbName,
   ub4 dbName_len,
   CONST OraText *tagInfo,
   ub4 tagInfo_len,
   OraText **retTagInfo,
   ub4 *retTagInfo_len,
   boolean *found,
   ub4 mode );

У них в параметрах есть  OraText *dbName в котором (по документации) нужно вводить имя базы. Но у меня первыми 2мя функциями воспользоваться не получилось. В Оракуле есть сложная система сессий и транзакций. Первая функция открывает сессию на каждого пользователя (тоесть система упрощенная). Я пробывал по разному их вызывать, но результата это не возымело. Пошел на "хитрость". Как сказал leniviy, OCIServerAttach принимает аргумент CONST text *dblink, но по документации
Цитата

dblink (IN)
Specifies the database server to use. This parameter points to a character string
which specifies a connect string or a service point. If the connect string is NULL, then
this call attaches to the default host.

т.е. это имя хоста, в который можно засунуть порт и название базы в таком формате: <host>:<port>/<db_name>, но это откроет сессию только на одну базу, что с точки зрения оптимизации не очень здорово, но совершенно удовлетворяет условиям моей задачи. Надеюсь, скоро проверю на нормальной версии базы данных и тогда все станет ясно. Еще отпишу, наверное smile
PM MAIL   Вверх
leniviy
Дата 14.8.2012, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



Цитата(dershokus @  14.8.2012,  08:53 Найти цитируемый пост)
но это откроет сессию только на одну базу, что с точки зрения оптимизации не очень здорово

Пожалуйста обьясни, как ты предполагаешь, какую возможность должен давать оптимизированный вариант. Переключать базу что ли?
Какими СУБД ты пользовался раньше?

Это сообщение отредактировал(а) leniviy - 14.8.2012, 10:26
PM MAIL   Вверх
dershokus
Дата 14.8.2012, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 7.8.2011

Репутация: нет
Всего: 1



leniviy, ну да. Ведь по настроящей схеме придется переподключаться к серверу, чтобы сменить базу. Если у нас на сервере 10 баз, значит нам нужно будет 10 раз переподключаться или держать 10 соединений, что не есть гуд. 
Но это мое личное мнение, возможно так все и должно быть. Я только копаюсь в OCI, но судя по тому, что предоставляет этот интерфейс - так делать не правильно smile. Скорее всего надо пользоваться SessionGet или Logon2, что у меня пока не вышло...
PM MAIL   Вверх
leniviy
Дата 14.8.2012, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



В MySQL и MSSQL на сервере может быть много баз, и действительно можно переключаться между ними в рамках одной сессии.
В оракле понятие "база" ближе к "серверу". Да, на одной инсталляции оракла можно поднять 2 базы, но у них будет разный SID, и это будут разные системные процессы.
Одно физическое подключение нельзя использовать для подключения к разным SID.

Аналогом MSSQL базы является "схема" оракла. Обычно имя схемы совпадает с логином. (В MSSQL тоже есть схемы, но там всё запутано).
Из sqlplus можно подключиться к другой схеме командой "CONNECT" и введя логин и пароль и текущий SID, но не уверен, что при этом сохраняется физическое подключение.


Это сообщение отредактировал(а) leniviy - 14.8.2012, 10:41
PM MAIL   Вверх
dershokus
Дата 15.8.2012, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 7.8.2011

Репутация: нет
Всего: 1



Спасибо за подсказу smile
Один маленький вопрос - oracle в стандарте использует placeholders вида ":<name>" а не "?" как в стандарте. Есть ли возможность использовать неименованые параметры т.е. знаки вопроса?
PM MAIL   Вверх
leniviy
Дата 15.8.2012, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



Насколько я знаю, нет. Чтобы было одинаково, надо ODBC какой-нибудь использовать, а не OCI.
В случае динамического SQL можно давать им имена :p1,:p2,...

Это сообщение отредактировал(а) leniviy - 15.8.2012, 14:26
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C++: Базы данных"
chipset

Данный форум предназначен для обсуждения вопросов прямым образом связанных с C++ и БД. Так, вопросы только по C++ следует задавать в C++:Общие вопросы а вопросы по абстрактным БД в Базах данных или в соответствующих под-форумах.

Благодарим за понимание.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, chipset.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Базы данных | Следующая тема »


 




[ Время генерации скрипта: 0.0693 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.