Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Базы данных > Ошибка при попытке соединиться с БД SQL


Автор: nikitos1980 3.4.2009, 11:47
Делаю приложение 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

Подскажите, в чем ошибка?
Спасибо

Автор: nikitos1980 3.4.2009, 16:32
Свойства проекта -> Configuration properties -> Linker -> Input -> Additional Dependencies
в сроке прописал Odbc32.lib Odbccp32.lib Odbcbcp.lib

Работает

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

Если тема решена - пометьте ее как решенную.

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

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 платформе (для веб) работают корректно и подключение происходит успешно.
Почему не происходит подключение, нужно ли как-нибудь указывать провайдера, может я неверно параметры задал?
Спасибо

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

Может. Ведь коннект к базе заключается не в одной функции SQLConnect

Автор: nikitos1980 8.4.2009, 10:04
А в чем может быть проблема, куда смотреть?
Код типовой вроде, никаких доп параметров не использую. База данных SQL Server.

Автор: Acer 8.4.2009, 17:33
nikitos1980, что возвращает SQLConnect() ? Переменные окружения, аттрибуты соединения правильно указываешь?

Автор: nikitos1980 10.4.2009, 09:37
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.

Автор: Acer 10.4.2009, 13:17
Сделай сначала это
Код

SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

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

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

В твоем порядке и не должно работать...

Автор: nikitos1980 14.4.2009, 15:15
После вызова
SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

возвращается значение, не равное  SQL_SUCCESS или SQL_SUCCESS_WITH_INFO, то есть ошибка, до соединения не доходит.
В чем можетбыть ошибка?

Автор: Acer 14.4.2009, 15:23
Посмотри, что возвращает SQLAllocHandle();
Посмотри на GetLastError();
Посмотри в msdn.

Добавлено через 2 минуты и 38 секунд
nikitos1980, вот так работает: http://reisyd.blogspot.com/2009/03/rodbc.html

Автор: nikitos1980 14.4.2009, 20:24
Отказался от подключения подобным образом.
Смог подключиться иначе:

Код

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);
    }
}


Автор: Acer 15.4.2009, 09:09
nikitos1980, вот теперь будет так, как ты писал smile MFC. А до этого ты пытался подключаться с помощью API функций

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)