我是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();
}
答案 0 :(得分:0)
以下行中指定的 DSN 似乎无效:
SQLCHAR szDSN [] =“D:\ Avi \ P \ mydb.mdb”;
基于字符串“D:\ Avi \ P \ mydb.mdb”,它看起来像是指定了数据库文件和路径而不是 DSN 。
您需要确保使用 ODBC管理员创建ODBC DSN。您将为配置的数据源名称字段提供字符串。您需要在代码中为 SQLCHAR szDSN [] =“”指定该字符串。
然而,这是一个解释错误的链接。如果你按照上面提到的那样,那应该可以解决错误。
致以最诚挚的问候,
Tony Hall