Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

пользовательское ODBC соединение

3.2K
22 мая 2009 года
Гудвин
186 / / 22.12.2007
Здравствуйте. Нужно организовать связь с MS Access базой, делаю как в исходнике, но при соединении программа стучится в реестр
HKLM\SOFTWARE\ODBC
а обычный пользователь таких прав не имеет, имеет только в
HKCU\SOFTWARE\ODBC
вот код соединения:

Код:
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

в итоге вылазит ошибка s1000, как быть?
3.2K
22 мая 2009 года
Гудвин
186 / / 22.12.2007
в connectData передается:
 
Код:
DRIVER=Microsoft Access Driver (*.mdb);
DBQ=C:\aa\Data\base.mdb;
SYSTEMDB=C:\aa\Data\baseuser.mdw;
UID=user;
PWD=password;
311
22 мая 2009 года
plastictown
309 / / 08.01.2006
А я делал, как у Шеферда написано: вручную добавляем источник данных и в App Wizard'e его выбираем. Тупо, зато работает:)
3.2K
22 мая 2009 года
Гудвин
186 / / 22.12.2007
да, работает) но в этой ситуации вручную делать источник данных не вариант(((
3.2K
22 мая 2009 года
Гудвин
186 / / 22.12.2007
люди, выручайте. как его правильно написать? :confused:
311
22 мая 2009 года
plastictown
309 / / 08.01.2006
Вот это вроде бы по вашему вопросу тоже из Шеферда, только DAO. Смотреть функцию
 
Код:
CEx32aDoc:DaoOpenMdb
.
Я сам не пробовал,но может быть поможет.
3.2K
23 мая 2009 года
Гудвин
186 / / 22.12.2007
спасибо. поизучаю
3.2K
12 июня 2009 года
Гудвин
186 / / 22.12.2007
в общем, стал создавать пользовательский дсн при подключении
Код:
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

передаю:
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;
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог