Форум программистов, компьютерный форум, киберфорум
Visual C++: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.66/32: Рейтинг темы: голосов - 32, средняя оценка - 4.66
Айхрень...
 Аватар для Paulie
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077

DBF с использованием ADO

29.04.2010, 09:53. Показов 6203. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, товарищи.

Необходимо открывать и читать существующий файлик ДБФ, и вытаскивать из него данные. Но существует проблема - ничего интересного в Интернет не нашёл, за исключением МСДНа.
Там есть примеры использования АДО с базами данных, на примере провайдера sqloledb, но мне нужно работать через Microsoft dBase driver (*.dbf). Вот собственно, что я пытался делать по примеру:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
_RecordsetPtr pRstEmployee = NULL;
_ConnectionPtr pConnection = NULL;
 
_bstr_t strCnn("Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=c:\\Reestrs\\In;");
 
IADORecordBinding *picRs = NULL;
CEmployeeRs emprs;
 
TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
pConnection->Open(strCnn, "", "", adConnectUnspecified);
 
TESTHR(pRstEmployee.CreateInstance(__uuidof(Recordset)));
pRstEmployee->Open(_variant_t("reg_p.dbf"), _variant_t((IDispatch *)pConnection, true), adOpenKeyset, adLockOptimistic, adCmdTable);
Первая часть кода отрабатывает, вторая уже нет. в чём может быть дело? Исключением генерится ошибка странная, с сообщением "Неизвестная ошибка"...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.04.2010, 09:53
Ответы с готовыми решениями:

Удаление записей в dbf с использованием ADO
Делаю 'cn - Connection cn.Execute ('DELETE * FROM spr.dbf') Записи помечаются на удаление. А как сделать, чтобы они физически...

ADO DBF
есть запрос query: CREATE TABLE tmpcube(table_id INTEGER , field0 INTEGER , field1 CHAR(200) , field2 Float(10,4) , field3 Float(10,4)...

Работа в DBF через ADO
Правильно ли я понимаю то что написано в заголовке? Объясните как реализовать доступ к БД (редактирование, создание) когда имена БД...

30
Айхрень...
 Аватар для Paulie
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077
29.04.2010, 16:30  [ТС]
Студворк — интернет-сервис помощи студентам
инлайн функция в заголовочном файле:
C++
1
inline void TESTHR(HRESULT x) { if FAILED(x) _com_issue_error(x); };
stdafx.h файлик стандартный с добавлением всяких нужных заголовков:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#pragma once
 
#include "targetver.h"
 
#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers
// Windows Header Files:
#include <windows.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
 
#include <oledb.h>
#include <conio.h>
#include "icrsint.h"
 
// TODO: reference additional headers your program requires here
 
#import "msado15.dll" no_namespace rename("EOF", "EndOfFile")
Ну и собственно, он, исходник DBFParser.cpp:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include "stdafx.h"
#include "DBFParser.h"
 
// class extracts only fname,lastname and hire_date from employee table
class CEmployeeRs : public CADORecordBinding {
   BEGIN_ADO_BINDING(CEmployeeRs)
 
      // Column fname is the 2nd field in the table   
      ADO_VARIABLE_LENGTH_ENTRY2(2, DataTypeEnum::adLongVarChar, reg_name, 
      200, le_reg_name, FALSE)
 
      // Column lname is the 4th field in the table.
      ADO_VARIABLE_LENGTH_ENTRY2(1, adInteger, in_c_page, 
      sizeof(in_c_page), le_in_c_page, FALSE)
 
      // Column hiredate is the 8th field in the table.
      ADO_VARIABLE_LENGTH_ENTRY2(4, adLongVarChar, in_path, 
     200, le_in_path, TRUE)
 
   END_ADO_BINDING()
 
public:
   CHAR   reg_name[20];
   ULONG   le_reg_name;
   INT   in_c_page;
   ULONG   le_in_c_page;
   CHAR   in_path[50];
   ULONG   le_in_path;
};
 
 
DLLEXP bool LoadFile(wchar_t *filename)
{
    _RecordsetPtr pRstEmployee = NULL;
    _ConnectionPtr pConnection = NULL;
 
    _bstr_t strCnn("Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=c:\\Reestrs\\In\\;");
 
    IADORecordBinding *picRs = NULL;
    CEmployeeRs emprs;
 
    MessageBox(0, L"DBF Parser loaded!", L"", 0);
 
    try
    {
MessageBox(0, L"1", L"", 0);
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open(strCnn, "", "", adConnectUnspecified);
MessageBox(0, L"2", L"", 0);
        TESTHR(pRstEmployee.CreateInstance(__uuidof(Recordset)));
MessageBox(0, L"2.5", L"", 0);
        pRstEmployee->Open(_variant_t("select * from a_ff.dbf"), _variant_t((IDispatch *)pConnection, true), adOpenKeyset, adLockOptimistic, adCmdTable);
MessageBox(0, L"3", L"", 0);
        TESTHR(pRstEmployee->QueryInterface(__uuidof(IADORecordBinding), (LPVOID*)&picRs));
MessageBox(0, L"4", L"", 0);
        TESTHR(picRs->BindToRecordset(&emprs));
MessageBox(0, L"5", L"", 0);
        MessageBoxA(0, emprs.reg_name, "employee", 0);
    }
    catch (_com_error &e)
    {
        MessageBox(0,  e.Description(), (LPCWSTR)e.ErrorMessage(), 0);
    }
 
    return true;
}
месаги я добавлял чтобы видеть где краш происходит, этот код внедрён в либо ДЛЛ, да и отладчиком я особо не пользуюсь, юзаю вообще экспресс версию 2010й студии!
Вложения
Тип файла: zip a_ff.zip (892 байт, 30 просмотров)
0
Айхрень...
 Аватар для Paulie
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077
29.04.2010, 16:36  [ТС]
У меня уже глаза опухли от всего прочитанного, особенно от МСДН... ) Сам буду продолжать разбираться уже завтра, заранее благодарю за помощь
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
29.04.2010, 17:34
при выполнении команды на открытие запроса вот такое мне выдает:
Непредвиденная ошибка драйвера внешней базы данных (8961)
как заточить драйвер хз.
к стати последний параметр в ф-ции открытия рекодсета должен быть adCmdCommand
1
Айхрень...
 Аватар для Paulie
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077
30.04.2010, 08:50  [ТС]
Попробовал указать adCmdFile, указал в кавычках имя файла, он мне выдал:
"Не удаётся создать набор записей из указанного источника. Файл источника или поток должен содержать данные Recordset в формате XML или ADTG"

Параметра adCmdCommand нет. Есть adCmdText. С ним такая же беда, как у тебя)) Буду разбираться, что ж ещё делать-то)
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
30.04.2010, 09:39
Цитата Сообщение от #Мессир Посмотреть сообщение
Параметра adCmdCommand нет. Есть adCmdText.
ну да, перепутал adCmdText надо
0
Айхрень...
 Аватар для Paulie
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077
30.04.2010, 09:54  [ТС]
oxotnik, это неважно, на самом деле, всё равно не работает ничерта)
Я тут ещё в сети встречал, что надо указывать версию базы данных, т.е. там dBaseIII, dBaseIV, как-то так, или это не поможет? ВОобще надо бы проверить, конено, но это я виел в строке подключения через Microsoft Jet OLEDB драйвер...
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
30.04.2010, 09:58
#Мессир, а что это вообще за файл такой? чем он создавался?
я видел код, который напрямую парсит dbf безо всяких провайдеров
0
Айхрень...
 Аватар для Paulie
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077
30.04.2010, 10:01  [ТС]
oxotnik, чувак, спасибо тебе огромное)) Я вроде как боле-менее разобрался в чём проблема была))) ФОрмат файла-то, оказывается, Visual FoxPro, я его пересохранил в dBASE IV, и всё заработало, точнее с кодировкой проблемы, но с этим я ещё буду разбираться Ну и, конечно, не интересно постоянно файлы пересохранять в dBASE IV, поэтому буду разбираться и с этим)))

Добавлено через 1 минуту
oxotnik, я бы тоже не отказался посмотреть на код без провайдера, да и сам мог бы написать, просто влом, честно признаюсь - влом разбираться (хотя ещё неизвестно, что сложнее, разобраться с провайдером, или структурой файла )) )..

Файл создаваться будет в пенсионном фонде, как они его там лабают - в душе не чаю...
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
30.04.2010, 10:41
вот класс прямой работы с дбф, только он с билдеровскими примочками, но можно переделать под чистый С++
1
Айхрень...
 Аватар для Paulie
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077
30.04.2010, 11:25  [ТС]
oxotnik, эм... мне доступа нет, а регаться.. доступа к мылу нет, ладно, вечерком гляну, когда домой доползу))
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
30.04.2010, 11:57
лови тогда
Вложения
Тип файла: zip DBF.zip (8.2 Кб, 63 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.04.2010, 11:57

ADO DBF и SQL, создания запроса
Всем читающим привет. Пишу прогу для работы с данными из таблицs DBF,(вариант менять бару не подойдет). беру данные с таблицы при...

Заполнить dbf полями грида (ADO)
Создаю dbf с помощью sql запроса через adoquery: ... with adoquery do begin sql.clear; sql.text := 'create table ' +...

ADO->ODBC->dbf пустые поля
Читаю dbf файл с помощью ADO-&gt;ODBC. Есть поле номер, причем в нем либо информация либо n-пробелов. Как узнать есть ли там полезная...

ADO & dbf: SELECT возвращает -1
Dim cd As New ADODB.Connection cd.Open 'Driver={Microsoft dBASE Driver (*.dbf)};Dbq=G:Obmen1C_Files;' Dim rd As New ADODB.Recordset ...

Как создать индексы к DBF в ADO?
Подобный вопрос уже был. Неужели никто не знает как создать индексы к DBF в ADO. Спасибо.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru