DBF & ODBC
От: grigor Россия  
Дата: 21.10.03 07:43
Оценка:
Уважаемые коллеги!
Помогите пожалуйста разобраться в следующей проблеме:
Имеется файл .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)."
Что здесь не так?
Re: DBF & ODBC
От: algol Россия about:blank
Дата: 21.10.03 11:29
Оценка:
Здравствуйте, 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.