2014-09-01 99 views
0

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

错误:[Microsoft] [ODBC Driver Manager]无效的字符串或缓冲区长度。

这里就是我特林

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

回答

0

看来,DSN以下行被指定无效:

SQLCHAR szDSN [] =“d:\阿维\ P \ MYDB.MDB“;

基于字符串“d:\阿维\ P \ MYDB.MDB”,它看起来像被指定,而不是DSN数据库文件和路径。

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

但是,下面是一个链接,可以解释更为一般细节中的错误;如果你按照上面提到的那样,那应该解决错误。

http://ow.ly/B0zCV

最好的问候,

托尼·霍尔

+0

谢谢您的回复,我编辑我的代码,如你所说,但得到的错误'无效的字符串或缓冲区length' – avinashse 2014-09-03 07:59:19

+0

的代码行什么产生这个错误? 你能分享完整的错误信息吗? – PRGSTony 2014-09-03 21:08:23

+0

函数'displayODBCError()','ErrMsg字段'包含错误,Exact错误只是这个'无效的字符串或缓冲区长度' – avinashse 2014-09-04 09:58:35