通过VC ++连接MS Access

时间:2014-09-01 06:10:05

标签: visual-c++ odbc

我是VC ++的新手,我正在尝试编写一个程序(经过大量的谷歌搜索)连接到ms访问,但它显示连接错误。我错过了什么或做错了什么。

错误:[Microsoft] [ODBC驱动程序管理器]无效的字符串或缓冲区长度。

以下是我的意思

Clearn_dbView::Clearn_dbView()
    : COleDBRecordView(Clearn_dbView::IDD)
{
    setUpODBC();  
}

Clearn_dbView::~Clearn_dbView()
{

    if(hDbConn  != SQL_NULL_HANDLE)
    {
        // Free Connection.
        SQLFreeHandle(SQL_HANDLE_DBC,hDbConn);
    }

    if(hOdbcEnv != SQL_NULL_HANDLE)
    {
        SQLFreeHandle(SQL_HANDLE_ENV, hOdbcEnv);
    }


}


void Clearn_dbView::setUpODBC()
{
    SQLRETURN sr;           //Return call for ODBC

    //Allocate Environment.
    sr = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&hOdbcEnv);
    if( sr != SQL_SUCCESS && sr != SQL_SUCCESS_WITH_INFO)
        AfxMessageBox(_T("Error in Allocating Environment."));

    // Set the App's ODBC Version
    sr = SQLSetEnvAttr(hOdbcEnv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
    if(sr != SQL_SUCCESS && sr != SQL_SUCCESS_WITH_INFO)
        AfxMessageBox(_T("Error in Setting ODBC Version."));;

    // Allocate Connection
    sr = SQLAllocHandle(SQL_HANDLE_DBC, hOdbcEnv, &hDbConn);
    //sr = SQLAllocConnect(hOdbcEnv, &hDbConn);
    if(sr != SQL_SUCCESS && sr != SQL_SUCCESS_WITH_INFO)
        AfxMessageBox(_T("Error in Allocating Connection."));;

    // Set Connect Timeout
    sr = SQLSetConnectAttr(hDbConn, SQL_ATTR_LOGIN_TIMEOUT, (void*)5, 0);
    if(sr != SQL_SUCCESS && sr != SQL_SUCCESS_WITH_INFO)
        AfxMessageBox(_T("Error in Setting Login Timeout."));

}

void Clearn_dbView::displayODBCError(SQLRETURN sr, char *inMessage)
{
    if(sr != SQL_SUCCESS && sr != SQL_SUCCESS_WITH_INFO) {
        SQLWCHAR SqlState[6];
        SQLINTEGER NativeError;
        SQLWCHAR ErrMsg[SQL_MAX_MESSAGE_LENGTH];
        int i = 1;
        char message[1000];
        strcpy (message, "");
        if (inMessage) {
            strcpy(message, inMessage);
            strcat(message, " — ");
        }
        sprintf(message, "%sError in SQLConnect(): %d.",message, sr);   
        MessageBoxA(NULL,message,"Error",MB_OK);

        while(SQLGetDiagRec(SQL_HANDLE_DBC, hDbConn, i,SqlState, &NativeError,ErrMsg, sizeof(ErrMsg), NULL)
            != SQL_NO_DATA) {
                sprintf(message,"Diag: %d, SQLSTATE: %s NativeError: %d ErrMsg: %s",i++, SqlState, NativeError, ErrMsg);
                MessageBoxA(NULL,message,"Error",MB_OK);
        }
    }
}

void Clearn_dbView::connectwithdb()
{
    SQLRETURN sr;
    SQLCHAR szDSN[] = "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DSN=D:\\Avi\\P\\mydb.mdb.dsn";
    SQLCHAR szUID[] = "";
    SQLCHAR szAuthStr[] = "";
    if(hDbConn == NULL) {
        MessageBox(_T("hDbConn IS NULL"));
        return;
    }
    sr = SQLConnectA(hDbConn, (UCHAR *)szDSN, SQL_NTS,
        (UCHAR *)szUID, SQL_NTS,
        (UCHAR *) szAuthStr, SQL_NTS);
    if(sr != SQL_SUCCESS && sr != SQL_SUCCESS_WITH_INFO) 
    {
        displayODBCError(sr, "Error in OnViewConnectwithsqlconnect");
    }
    else
    {
        MessageBox(_T("else executed"));
        MessageBox(_T("Connected OK"));
    }

}


void Clearn_dbView::OnBnClickedConnect()
{
    connectwithdb();
}

1 个答案:

答案 0 :(得分:0)

以下行中指定的 DSN 似乎无效:

SQLCHAR szDSN [] =“D:\ Avi \ P \ mydb.mdb”;

基于字符串“D:\ Avi \ P \ mydb.mdb”,它看起来像是指定了数据库文件和路径而不是 DSN

您需要确保使用 ODBC管理员创建ODBC DSN。您将为配置的数据源名称字段提供字符串。您需要在代码中为 SQLCHAR szDSN [] =“”指定该字符串。

然而,这是一个解释错误的链接。如果你按照上面提到的那样,那应该可以解决错误。

http://ow.ly/B0zCV

致以最诚挚的问候,

Tony Hall