Уважаемые коллеги!
Помогите пожалуйста разобраться в следующей проблеме:
Имеется файл .DBF (test.dbf), который имеет 5 полей: pk_num — числовое (тип 'I', 4 байта),
а остальные (param1, param2, param3, param4) — символьные, размером 32 байта каждое.
Файл прекрасно смотрится Exсel'ем.
Требуется его проиндексировать по какому-либо полю. Причем это нужно сделать на VC++
c использованием ODBC. DBF — файл описывается в System DSN как Microsoft dBase Driver (*.dbf).
Соединение с базой (SQLAllocHandle, SQLConnect и пр.) происходит нормально.
далее идет следующий код:
CHAR szQuery[256];
ZeroMemory(szQuery,sizeof(szQuery));
wsprintf(szQuery,"CREATE UNIQUE INDEX a1 ON test (pk_num)");
retcode = SQLExecDirect(hstmt,(SQLCHAR*)szQuery,SQL_NTS);
где a1 — имя создаваемого индексного файла (*.idx), а test — имя таблицы, в случае DBF
(насколько мне известно) совпадает с именем базы.
Функция SQLExecDirect завершается с ошибкой и при последующем анализе ошибки функцией SQLGetDiagRec
строковое сообщение об ошибке имеет вид:
"[Microsoft][Драйвер ODBC dBase] Непредвиденная ошибка драйвера внешней базы данных (8961)."
Что здесь не так?
Здравствуйте, grigor, Вы писали:
G>Уважаемые коллеги! G>Помогите пожалуйста разобраться в следующей проблеме: G>Имеется файл .DBF (test.dbf), который имеет 5 полей: pk_num — числовое (тип 'I', 4 байта), G>а остальные (param1, param2, param3, param4) — символьные, размером 32 байта каждое. G>Файл прекрасно смотрится Exсel'ем. G>Требуется его проиндексировать по какому-либо полю. Причем это нужно сделать на VC++ G>c использованием ODBC. DBF — файл описывается в System DSN как Microsoft dBase Driver (*.dbf). G>Соединение с базой (SQLAllocHandle, SQLConnect и пр.) происходит нормально. G>далее идет следующий код: G> CHAR szQuery[256]; G> ZeroMemory(szQuery,sizeof(szQuery)); G> wsprintf(szQuery,"CREATE UNIQUE INDEX a1 ON test (pk_num)"); G> retcode = SQLExecDirect(hstmt,(SQLCHAR*)szQuery,SQL_NTS); G>где a1 — имя создаваемого индексного файла (*.idx), а test — имя таблицы, в случае DBF G>(насколько мне известно) совпадает с именем базы. G>Функция SQLExecDirect завершается с ошибкой и при последующем анализе ошибки функцией SQLGetDiagRec G>строковое сообщение об ошибке имеет вид: G>"[Microsoft][Драйвер ODBC dBase] Непредвиденная ошибка драйвера внешней базы данных (8961)." G>Что здесь не так?
Похоже, что это таблица не dBase, а FoxPro (тип данных I, индексный файл idx). ISAM драйвер dBase может не поддерживать такие файлы. Лучше взять ODBC драйвер Visual FoxPro. При этом запрос изменится на "INDEX ON pk_num TO a1 UNIQUE".
Re[2]: DBF & ODBC
От:
Аноним
Дата:
22.10.03 11:41
Оценка:
Здравствуйте, algol, Вы писали:
A>Здравствуйте, grigor, Вы писали:
G>>Уважаемые коллеги! G>>Помогите пожалуйста разобраться в следующей проблеме: G>>Имеется файл .DBF (test.dbf), который имеет 5 полей: pk_num — числовое (тип 'I', 4 байта), G>>а остальные (param1, param2, param3, param4) — символьные, размером 32 байта каждое. G>>Файл прекрасно смотрится Exсel'ем. G>>Требуется его проиндексировать по какому-либо полю. Причем это нужно сделать на VC++ G>>c использованием ODBC. DBF — файл описывается в System DSN как Microsoft dBase Driver (*.dbf). G>>Соединение с базой (SQLAllocHandle, SQLConnect и пр.) происходит нормально. G>>далее идет следующий код: G>> CHAR szQuery[256]; G>> ZeroMemory(szQuery,sizeof(szQuery)); G>> wsprintf(szQuery,"CREATE UNIQUE INDEX a1 ON test (pk_num)"); G>> retcode = SQLExecDirect(hstmt,(SQLCHAR*)szQuery,SQL_NTS); G>>где a1 — имя создаваемого индексного файла (*.idx), а test — имя таблицы, в случае DBF G>>(насколько мне известно) совпадает с именем базы. G>>Функция SQLExecDirect завершается с ошибкой и при последующем анализе ошибки функцией SQLGetDiagRec G>>строковое сообщение об ошибке имеет вид: G>>"[Microsoft][Драйвер ODBC dBase] Непредвиденная ошибка драйвера внешней базы данных (8961)." G>>Что здесь не так?
A>Похоже, что это таблица не dBase, а FoxPro (тип данных I, индексный файл idx). ISAM драйвер dBase может не поддерживать такие файлы. Лучше взять ODBC драйвер Visual FoxPro. При этом запрос изменится на "INDEX ON pk_num TO a1 UNIQUE".
Извините, сам разобрался. Оказывается мой DBF — файл формировался немного некорректно, а именно — в заголовке не заполнялось поле даты последней модификации. После заполнения этого поля инструкция CREATE UNIQUE INDEX a1 ON test (pk_num ASC) срабатывает нормально. Правда формируется индексный файл *.mdx и текстовый *.inf, а не *.idx.