Bool connect (String & connectData, Bool bAutoCommit)
{
Assert(hDbc == NULL);
// allocate environment handle if necessary
if (hEnv == NULL)
{
SQLSetEnvAttr(NULL, SQL_ATTR_CONNECTION_POOLING, (SQLPOINTER) SQL_CP_ONE_PER_HENV, 0);
if (SQLAllocEnv(&hEnv) != SQL_SUCCESS)
{
return getError();
}
}
totalOpen++;
// allocate database handle
if (SQLAllocConnect(hEnv, &hDbc) != SQL_SUCCESS)
{
getError();
forceDisconnect();
return FALSE;
}
// turn off ODBC tracing ?
if (! bTrace)
{
if (SQLSetConnectOption(hDbc, SQL_OPT_TRACE, FALSE) != SQL_SUCCESS)
{
getError();
forceDisconnect();
return FALSE;
}
}
// set specified autocommit
if (SQLSetConnectOption(hDbc, SQL_AUTOCOMMIT, bAutoCommit) != SQL_SUCCESS)
{
getError();
forceDisconnect();
return FALSE;
}
// connect to specified data source
const char * pConnectData = connectData;
char buffer[512];
buffer[0] = '\0';
SWORD len = 0;
Int32 ret = SQLDriverConnect(hDbc, NULL, (LPBYTE) pConnectData, SQL_NTS,
(LPBYTE) buffer, sizeof buffer,
&len, SQL_DRIVER_NOPROMPT);
if (ret == SQL_SUCCESS_WITH_INFO)
{
getError();
ret = SQL_SUCCESS;
}
if (ret != SQL_SUCCESS)
{
getError();
// forceDisconnect will fail because we're not connected
// so we free the database handle without freeing the connection
if (SQLFreeConnect(hDbc) != SQL_SUCCESS)
{
return FALSE;
}
hDbc = NULL;
// now it's OK to let normal flow resume
forceDisconnect();
return FALSE;
}
// allocate statement handle
if (SQLAllocStmt(hDbc, &hStmt) != SQL_SUCCESS)
{
getError();
forceDisconnect();
return FALSE;
}
// successful, return the actual connect data
connectData = String(buffer, len);
return TRUE;
} // connect
пользовательское ODBC соединение
HKLM\SOFTWARE\ODBC
а обычный пользователь таких прав не имеет, имеет только в
HKCU\SOFTWARE\ODBC
вот код соединения:
Код:
в итоге вылазит ошибка s1000, как быть?
Код:
DRIVER=Microsoft Access Driver (*.mdb);
DBQ=C:\aa\Data\base.mdb;
SYSTEMDB=C:\aa\Data\baseuser.mdw;
UID=user;
PWD=password;
DBQ=C:\aa\Data\base.mdb;
SYSTEMDB=C:\aa\Data\baseuser.mdw;
UID=user;
PWD=password;
А я делал, как у Шеферда написано: вручную добавляем источник данных и в App Wizard'e его выбираем. Тупо, зато работает:)
да, работает) но в этой ситуации вручную делать источник данных не вариант(((
люди, выручайте. как его правильно написать? :confused:
Код:
CEx32aDoc:DaoOpenMdb
Я сам не пробовал,но может быть поможет.
спасибо. поизучаю
Код:
Bool createDsn (const String & driver, const String & dsn, Bool Overwrite)
{
Index bytes = dsn.length() + 1;
char * pDsn = new char [bytes];
memcpy(pDsn, dsn, bytes);
for (char * p = pDsn; *p != '\0'; p++)
{
if (*p == ';') *p = '\0';
}
if (Overwrite)
{
char * pDsn2 = new char [bytes];
memset(pDsn2, 0, bytes);
lstrcpy(pDsn2, pDsn);
SQLConfigDataSource(NULL, ODBC_REMOVE_DSN, driver, pDsn);
delete [] pDsn2;
}
Bool Ok = SQLConfigDataSource(NULL, ODBC_ADD_DSN, driver, pDsn);
delete [] pDsn;
return Ok;
} // createDsn
{
Index bytes = dsn.length() + 1;
char * pDsn = new char [bytes];
memcpy(pDsn, dsn, bytes);
for (char * p = pDsn; *p != '\0'; p++)
{
if (*p == ';') *p = '\0';
}
if (Overwrite)
{
char * pDsn2 = new char [bytes];
memset(pDsn2, 0, bytes);
lstrcpy(pDsn2, pDsn);
SQLConfigDataSource(NULL, ODBC_REMOVE_DSN, driver, pDsn);
delete [] pDsn2;
}
Bool Ok = SQLConfigDataSource(NULL, ODBC_ADD_DSN, driver, pDsn);
delete [] pDsn;
return Ok;
} // createDsn
передаю:
DSN=MyProgDSN
DRIVER=Microsoft Access Driver (*.mdb);
DBQ=C:\aa\Data\base.mdb;
SYSTEMDB=C:\aa\Data\baseuser.mdw;
UID=user;
PWD=password;
потом меняю connectData на:
DSN=MyProgDSN;