Не удается подключиться к базе данных Access с помощью C ++ - PullRequest
0 голосов
/ 12 апреля 2011

Моя тема несколько глупа и сложна для меня. Я пытаюсь сделать очень простое соединение с БД Access 2007, но соединение никогда не происходит. Я пытаюсь увидеть, что происходит с SQLGetDiagRec (), но программа падает, когда выполняется SQLGetDiagRec (). Я не настолько увлечен C ++, поэтому я застрял в последние несколько дней в этом. Любая помощь будет высоко оценена. Я использую Visual C ++ 2008.

РЕДАКТИРОВАТЬ: после изменения набора символов с Unicode на Multibyte я смог выполнить SQLGetDiagRec. Затем я изменил два указателя с int и char на SQLSMALLINT и SQLCHAR, и, бэм, это сработало. Большое спасибо за хедз-ап парней.

#include "stdafx.h"
#include <windows.h>
#include <conio.h>
#include <iostream>
#include <sql.h>
#include <sqltypes.h>
#include <sqlext.h>
#include <stdio.h>
#include <stdlib.h>


int main(){
    char szDSN[256] = "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DSN='Hospital_mdb';DBQ=C:\\Hospital.mdb;";
    SQLHANDLE EnvHandlePtr;
    SQLHANDLE ConHandle;
    SQLHANDLE StmtHandle;
    SQLRETURN rc;

    SQLSMALLINT iConnStrLength2Ptr; // Changing from int     iConnStrLength2Ptr;
    SQLCHAR szConnStrOut[256]; //changing from char    szConnStrOut[256];
    SQLCHAR SQLState[6], Msg[SQL_MAX_MESSAGE_LENGTH];
    SQLINTEGER NativeError;
    SQLSMALLINT MsgLen;


    if ( (rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &EnvHandlePtr)) == SQL_SUCCESS){
        printf("Environment Set!");
        if( (rc = SQLSetEnvAttr(EnvHandlePtr, SQL_ATTR_ODBC_VERSION,
            (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_UINTEGER))==SQL_SUCCESS ){
                printf("Driver Set!");
                if ( (rc = SQLAllocHandle(SQL_HANDLE_DBC, EnvHandlePtr, &ConHandle))==SQL_SUCCESS ){
                    printf("Allocation Done!");//**so far, so good, but then the connection doesn't happen**
                    rc = SQLDriverConnect(ConHandle, NULL, (SQLWCHAR*)szDSN, 
                        SQL_NTS, (SQLWCHAR*) szConnStrOut, 0, (SQLSMALLINT*) iConnStrLength2Ptr, SQL_DRIVER_NOPROMPT);
                    if ( rc == SQL_SUCCESS ){
                    //if ( (rc = SQLConnect(ConHandle, (SQLWCHAR*)szDSN, SQL_NTS, (SQLWCHAR*)"", SQL_NTS, (SQLWCHAR*)"", SQL_NTS))== SQL_SUCCESS ){
                        printf("Connection Done");
                    }//end of Connection clause
                    else{   
                        SQLGetDiagRec(SQL_HANDLE_DBC, ConHandle, 1, (SQLWCHAR*)SQLState, &NativeError, (SQLWCHAR*)Msg, sizeof(Msg), &MsgLen);
                            printf("Connection Failed\n%s", Msg);
                    }
                    SQLDisconnect(ConHandle);
                }//end of Connection Allocation clause
                SQLFreeHandle(SQL_HANDLE_DBC, ConHandle);
        }//end of Driver clause
        SQLFreeHandle(SQL_HANDLE_ENV, EnvHandlePtr);
    }//end of Enviroment clause

    _getch();

}//end of main

1 Ответ

2 голосов
/ 12 апреля 2011

Вы отбрасываете диагностику, которую генерирует компилятор для вашего плохого кода.По крайней мере, SQLState плох, вы передаете 6-байтовый буфер, когда записано 12 байт.Это портит кадр стека.Вызов SQLDriverConnect не может работать по той же причине.

Удалите все приведения путем правильного объявления локальных переменных.

И используйте Unicode в своем коде.Вы можете отключить его в настройках своего проекта, но это никогда не является ошибкой при работе с базой данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...