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();
}
谢谢您的回复,我编辑我的代码,如你所说,但得到的错误'无效的字符串或缓冲区length' – avinashse 2014-09-03 07:59:19
的代码行什么产生这个错误? 你能分享完整的错误信息吗? – PRGSTony 2014-09-03 21:08:23
函数'displayODBCError()','ErrMsg字段'包含错误,Exact错误只是这个'无效的字符串或缓冲区长度' – avinashse 2014-09-04 09:58:35