Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка при попытке соединиться с БД SQL 
V
    Опции темы
nikitos1980
Дата 3.4.2009, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Делаю приложение MFC. Необходимо считать данные из SQL БД. Пытаюсь соединиться так:

Код

#include <windows.h>
#include <sql.h>
#include <sqlext.h>

   // имена конечно другие, реальные
   CString strServer("servername");
   CString strUser("User_name");
   CString strPassword("password");
   CString strDatabase("database_name");
   SQLHENV henv;
   SQLHDBC hdbc;
   SQLHSTMT hstmt;
   SQLRETURN retcode;
   SQLPOINTER rgbValue;
   int i = 5;
   rgbValue = &i;

   SQLCHAR * OutConnStr = (SQLCHAR * )malloc(255);
   SQLSMALLINT * OutConnStrLen = (SQLSMALLINT *)malloc(255);

   // Allocate environment handle
   retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

   // Set the ODBC version environment attribute
   if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
      retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); 

      // Allocate connection handle
      if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
         retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); 

         // Set login timeout to 5 seconds
         if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
            SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)(rgbValue), 0);

            // Connect to data source
            retcode = SQLConnect(hdbc, (SQLWCHAR*) strServer.GetBuffer(), SQL_NTS, (SQLWCHAR*) strUser.GetBuffer(), 0, (SQLWCHAR*) strPassword.GetBuffer(), 0);

            // Allocate statement handle
            if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
               retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 

               // Process data
               if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
                  SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
               }

               SQLDisconnect(hdbc);
            }

            SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
         }
      }
      SQLFreeHandle(SQL_HANDLE_ENV, henv);
   }


при компилировании получаю ошибку

Код

Error    2    error LNK2019: unresolved external symbol _SQLDisconnect@4 referenced in function "public: void __thiscall CIndasportView::GetSQLData(void)" (?GetSQLData@CIndasportView@@QAEXXZ)    IndasportView.obj    

// ошибка появляется на каждую функцию SQLFreeHandle

Подскажите, в чем ошибка?
Спасибо
PM MAIL WWW   Вверх
nikitos1980
Дата 3.4.2009, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Свойства проекта -> Configuration properties -> Linker -> Input -> Additional Dependencies
в сроке прописал Odbc32.lib Odbccp32.lib Odbcbcp.lib

Работает
PM MAIL WWW   Вверх
Anikmar
Дата 3.4.2009, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(nikitos1980 @  3.4.2009,  16:32 Найти цитируемый пост)
Работает 

Если тема решена - пометьте ее как решенную.
PM MAIL ICQ   Вверх
nikitos1980
Дата 7.4.2009, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нужна помощь с подключением. 
Код компилируется, но, по-видимому, подключение не происходит. 
Код

retcode = SQLConnect(hdbc, (SQLWCHAR*) strServer.GetBuffer(), SQL_NTS, (SQLWCHAR*) strUser.GetBuffer(), 0, (SQLWCHAR*) strPassword.GetBuffer(), 0);

// strServer - адрес сервера, например HOME\\SQLSERVER
// strUser - UID юзера, например root
// strPassword - пароль, 111

Адрес сервера, логин и пароль верные, проверены, на .NET платформе (для веб) работают корректно и подключение происходит успешно.
Почему не происходит подключение, нужно ли как-нибудь указывать провайдера, может я неверно параметры задал?
Спасибо


Это сообщение отредактировал(а) nikitos1980 - 7.4.2009, 16:23
PM MAIL WWW   Вверх
Acer
Дата 8.4.2009, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 0
Всего: 8



Цитата(nikitos1980 @ 7.4.2009,  13:45)
может я неверно параметры задал?

Может. Ведь коннект к базе заключается не в одной функции SQLConnect
PM MAIL   Вверх
nikitos1980
Дата 8.4.2009, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А в чем может быть проблема, куда смотреть?
Код типовой вроде, никаких доп параметров не использую. База данных SQL Server.
PM MAIL WWW   Вверх
Acer
Дата 8.4.2009, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 0
Всего: 8



nikitos1980, что возвращает SQLConnect() ? Переменные окружения, аттрибуты соединения правильно указываешь?
PM MAIL   Вверх
nikitos1980
Дата 10.4.2009, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Acer, в блоке кода:

Код

            // Connect to data source
            retcode = SQLConnect(hdbc, (SQLWCHAR*) strServer.GetBuffer(), SQL_NTS, (SQLWCHAR*) strUser.GetBuffer(), 0, (SQLWCHAR*) strPassword.GetBuffer(), 0);

            // Allocate statement handle
            if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
               retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 
               TRACE("Connected\n");
               // Process data
               if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
                  SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
               }

               SQLDisconnect(hdbc);
            }
             else
             {
                     TRACE("Connection aborted\n");
              }



я делаю трассировку для успешного и неудачного соединения. Согласно этим операциям, я не попадаю в условие 
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
{
      //...
}

Опять же повторю, что соединение работает на ASP.NET (я просто пишу код для MFC приложения, Framework использовать не получится), сервер, логин, пароль те же, они рабочие...
Пытался подключаться к локальному серверу, и к удаленному (конечно, адреса разные), не получается. Уж все перепробовал, может вообще не туда смотрю...?
Сервер бд - SQL Server.

Это сообщение отредактировал(а) nikitos1980 - 10.4.2009, 09:38
PM MAIL WWW   Вверх
Acer
Дата 10.4.2009, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 0
Всего: 8



Сделай сначала это
Код

SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

а потом это
Код

SQLConnect(hdbc, (SQLWCHAR*) strServer.GetBuffer(), SQL_NTS, (SQLWCHAR*) strUser.GetBuffer(), 0, (SQLWCHAR*) strPassword.GetBuffer(), 0);

В твоем порядке и не должно работать...
PM MAIL   Вверх
nikitos1980
Дата 14.4.2009, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



После вызова
SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

возвращается значение, не равное  SQL_SUCCESS или SQL_SUCCESS_WITH_INFO, то есть ошибка, до соединения не доходит.
В чем можетбыть ошибка?
PM MAIL WWW   Вверх
Acer
Дата 14.4.2009, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 0
Всего: 8



Посмотри, что возвращает SQLAllocHandle();
Посмотри на GetLastError();
Посмотри в msdn.

Добавлено через 2 минуты и 38 секунд
nikitos1980, вот так работает: link
PM MAIL   Вверх
nikitos1980
Дата 14.4.2009, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Отказался от подключения подобным образом.
Смог подключиться иначе:

Код

CString strServer("sql_servr_address");
CString strUser("user_name");
CString strPassword("user_pw");
CString strDatabase("DBname");
CString connString;
connString.Format(_T("driver={SQL Server};server=%s;UID=%s;PWD=%s;DATABASE=%s"), strServer, strUser, strPassword, strDatabase);
CDatabase m_Database;
if (!m_Database.OpenEx(connString))
{
    Report("NOT Connected");
}
else
{
    Report("Connected");
    CRecordset record(&m_Database);
    if (record.Open(AFX_DB_USE_DEFAULT_TYPE, _T("SELECT * FROM table_name ORDER BY id DESC")))
    {
        CString strResult;
        record.GetFieldValue(_T("row_name"), strResult);
    }
}


PM MAIL WWW   Вверх
Acer
Дата 15.4.2009, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 0
Всего: 8



nikitos1980, вот теперь будет так, как ты писал smile MFC. А до этого ты пытался подключаться с помощью API функций
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C++: Базы данных"
chipset

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

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


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

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


 




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


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

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