sankars3 Ответов: 2

Как использовать базу данных ms access на языке C++?


How to link database to my project code in win32.Yesterday i saw below link 

https://msdn.microsoft.com/en-us/library/office/ff965871(v=office.14)#DataProgrammingWithAccess2010_ATLOLEDBExample 

but no use above code.Please help me?
Thanks in advance

What I have tried:

I tried above link with different databases but not work.


Эта ссылка тоже не работает

https://msdn.microsoft.com/en-us/library/cc811599.aspx#Y3869

[Правка Йохена Арндта: вставленный код и текст, опубликованные в качестве решения]
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")

hr=S_OK;
try
{
    CoInitialize(NULL);
    _bstr_t strCnn("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\\Sankar\\Database1.accdb");
    _RecordsetPtr pRstAuthors=NULL;
     
    _ConnectionPtr  pConnection=NULL;
     
    // Call Create instance to instantiate the Record set
    hr = pRstAuthors.CreateInstance(__uuidof(Recordset));
    pConnection.CreateInstance(_uuidof(Connection));
    pConnection->ConnectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\\Sankar\\Database1.accdb";
    pConnection->ConnectionTimeout = 30;  
    if(FAILED(hr))
    {
        // printf("Failed creating record set instance\n");
        return;
    }
    //Open the Record set for getting records from Customer table
    pRstAuthors->Open("SELECT* FROM Customers","Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\\Sankar\\Database1.accdb",adOpenStatic,adLockReadOnly, adCmdText);
 
    _bstr_t valField1;
    int valField2;
    pRstAuthors->MoveFirst();
    if (!pRstAuthors->EndOfFile)
    {
        while(!pRstAuthors->EndOfFile)
        {
            valField1 = pRstAuthors->Fields->GetItem("username")->Value.intVal;
        }
    }
}
catch(_com_error & ce)
{
    //sprintf("Error:%s\n",ce.Description);
}
CoUninitialize();

pRstAuthors->Open: В этом методе я получил ошибку.
[/РЕДАКТИРОВАТЬ]

Richard MacCutchan

Что "не использовать код выше" значит?

Richard MacCutchan

Почему вы жестко кодируете строку подключения в трех разных местах?

Richard MacCutchan

Вы вызываете метод на pRstAuthors, но вы никогда не инициализируете его, чтобы указать на что-либо. А если посмотреть на остальную часть кода, то есть и другие подобные ошибки. Вы действительно написали этот код или он просто скопирован из интернета, хотя и неполный?

2 Ответов

Рейтинг:
2

RickZeeland

См. эту статью: Разработка решений Access 2007 с использованием собственного языка C или C++[^]
Смотрите здесь для деталей соединения с провайдером=Майкрософт.Туз.Oledb для.12 : Майкрософт туз данных oledb 12.0 строки подключения - ConnectionStrings.com[^]

Пример:

_bstr_t strCnn("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\\Sankar\\Database1.accdb;Persist Security Info=False;");


sankars3

#импорт "C:\Program файлы\общие Files\System\ADO\msado15.dll" \
no_namespace rename ("EOF", " EndOfFile")


ч=значение s_ok;
пробовать
{
CoInitialize(NULL);
StrCnn _bstr_t("поставщик=Майкрософт.Туз.Oledb для.12.0;Источник Данных=Е:\\В\\Базы Данных1.# то # ");
_RecordsetPtr pRstAuthors=NULL;

_ConnectionPtr pConnection=NULL;
 
// Призыв создать экземпляр для создания набора записей
hr = pRstAuthors.CreateInstance (__uuidof(Recordset));
pConnection.CreateInstance (_uuidof(соединение));
pConnection->По строке connectionString="поставщика=Майкрософт.Туз.Oledb для.12.0;Источник Данных=Е:\\В\\Базы Данных1.# то # ";
pConnection-> ConnectionTimeout = 30;

if (FAILED(hr))
{
// printf ("не удалось создать экземпляр набора записей\n");
вернуть;
}

// Откройте набор записей для получения записей из таблицы Customer

pRstAuthors->открыть("выбрать* из клиенты","поставщик=Майкрософт.Туз.Oledb для.12.0;Источник Данных=Е:\\В\\Базы Данных1.# то#", adOpenStatic,adLockReadOnly, котором предложение);
 
_bstr_t valField1;
инт valField2;

pRstAuthors- & gt;MoveFirst();
 
if (! pRstAuthors- & gt;EndOfFile)
{
 
while (! pRstAuthors- & gt;EndOfFile)
{
valField1 = pRstAuthors-&ГТ;поля-и GT;метод getitem("логин")-и GT;значение.intVal;
}
}
}
catch(_com_error & ce)
{

//sprintf ("ошибка:%s\n", ce.Описание);
}
CoUninitialize();

выше кода я получил ошибку pRstAuthors- & gt;Open method.Пожалуйста, помогите Рикзиленду.Спасибо за advacne.

RickZeeland

Возможно, вам придется добавить 'Persist Security Info=False;'

sankars3

куда я положил этого.пожалуйста, помогите мне?

Рейтинг:
1

Jochen Arndt

Все это содержится в ссылке из вашего вопроса.

Вы должны решить, какой метод вы хотите использовать:


  • Прямой DAO (Win32)
  • ATL OLE DB (ATL/MFC)
  • ADO (Win32)
  • Прямой ODBC (Win32)
  • MFC ODBC (MFC)

Методы Win32 требуют импорта библиотеки DLL, что может быть немного сложно, чтобы избежать конфликтов имен.

В зависимости от используемого метода может потребоваться отправить дополнительные пакеты вместе с вашим приложением, чтобы убедиться, что используемый интерфейс базы данных установлен на клиенте (Microsoft Access Redistributables или MDAC, которые должны присутствовать во всех последних версиях Windows, начиная с Vista/7).

См. также примечания о 32/64 битах. Если возможно, создайте 32-битное приложение.

DAO обеспечивает наилучшую поддержку (больше функций, чем другие методы). При использовании MFC существуют классы для OLE DB и ODBC, которые сокращают объем кода для записи.

Если вы застряли с определенным методом, спросите еще раз или обновите свой вопрос коротким примером кода и подробным описанием проблемы. "Не работает" для нас ничего не значит, особенно если у нас нет ни одного фрагмента кода и сообщения об ошибке.

[Правка: для кода, опубликованного тем временем]
Если функция возвращает какое-то состояние / ошибку, проверьте это и немедленно сообщите об ошибках. Ваш фрагмент кода делает это не для всех функций и иногда сообщает об ошибках после вызова другой функции. Прочтите также документацию по используемой функции, чтобы узнать, какие параметры должны быть переданы.

Вы также должны следовать примерам относительно порядка вызываемых функций:

  • Создать _ConnectionPtr
  • Откройте соединение
  • Создание RecordsetPtr
  • Откройте набор записей, передающий соединение

Подробно:
pRstAuthors->Open("SELECT* FROM Customers","Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\\Sankar\\Database1.accdb",adOpenStatic,adLockReadOnly, adCmdText);
это не действительный вызов. Он пропускает передачу соединения. Так и должно быть:
pRstAuthors->Open("SELECT* FROM Customers","Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\\Sankar\\Database1.accdb",
_variant_t((IDispatch *) pConnection, true),
adOpenStatic,
adLockReadOnly, 
adCmdText);
[/РЕДАКТИРОВАТЬ]


sankars3

Вчера я использовал ATL OLEDB, ADO и Direct ODBC.Эти три базы данных не работали должным образом в моей системе.

Mohibur Rashid

Не сработало должным образом-недостаточно предложить помощь. Вам тоже нужно Поделиться сообщением об ошибке

Jochen Arndt

Я использовал все эти методы в прошлом. Так что они работают.

Если они не работают на Вас, Вы, должно быть, сделали что-то не так.
Но мы не можем вам помочь, пока вы не расскажете нам подробно, что вы сделали и что получили (особенно полное сообщение об ошибке и где это произошло).

sankars3

hr = dbDataSource.OpenFromInitializationString(lpcOleConnect);
в приведенном выше коде я получил ошибку.В этом я пробовал разные методы

hr=dbDataSource.OpenFromFile(lpoleConnect);
Спасибо за помощь Йохену Арндту..

sankars3

ошибка: CoInitialized не вызывается в источнике данных.

Jochen Arndt

В вашем коде, который я перешел к вашему вопросу, вы вызываете CoInitalize ().
Но это тоже возвращает код состояния, который можно проверить. Вы также должны переместить этот вызов из блока try.

Также рекомендуется вызвать CoInitalizeEx ().

sankars3

спасибо вам. пожалуйста, найдите ссылку ниже.
https://stackoverflow.com/questions/45539782/how-to-acess-database-in-win32

sankars3

hr = 0x80040154 класс не зарегистрирован, когда я вызвал эту ошибку?
Заранее спасибо.

Jochen Arndt

На каком вызове для какого класса?

Обычно это означает, что класс, на который ссылается ваше приложение (например, с помощью CreateInstance), не может быть найден, поскольку DLL, содержащая этот класс, отсутствует в вашей системе или не была зарегистрирована.

В зависимости от этого вы должны убедиться, что DLL присутствует и была зарегистрирована. Возможная причина:
- DLL отсутствует: установите его (например, Access redistributables, MDAC и т. д)
- Регистрация потеряна (может произойти с более старыми версиями Windows): восстановите установку или переустановите
- Приложение / зарегистрированная версия DLL не соответствует (32/64 бит)
- Приложение 64-битное: если класс доступен только как 32-битный, вы должны создать 32-битное приложение

sankars3

большое спасибо Йохену Арндту.Я проверю..

sankars3

#include & lt;string>
#включить & lt;windows. h>
код #include "файл stdafx.ч"
#включить "DatabaseHandler. h"

использование пространства имен std;


#импорт "C:\Program файлы\общие Files\System\ADO\msado15.dll" \
no_namespace rename ("EOF", " EndOfFile")

HRESULT hr;

CDatabaseHandler:: CDatabaseHandler(void)
{
ч=значение s_ok;
CoInitialize(0);
пробовать
{

StrCnn _bstr_t("поставщик=Майкрософт.Туз.Oledb для.12.0;Источник Данных=Е:\\В\\Базы Данных1.# то # ;");
_RecordsetPtr pRstAuthors=NULL;

_ConnectionPtr pConnection=NULL;

// Призыв создать экземпляр для создания набора записей
hr = pRstAuthors.CreateInstance (__uuidof(Recordset));

if (FAILED(hr))
{

вернуть;
}

// Откройте набор записей для получения записей из таблицы Customer

//pRstAuthors- & gt;raw_Open ("SELECT* FROM Customers;", strCnn, adOpenStatic, adLockReadOnly, adCmdText);
pRstAuthors - & gt;Open ("SELECT* FROM Customers;", strCnn, adOpenStatic,adLockReadOnly, adCmdText);

_bstr_t valField1;
инт valField2;

pRstAuthors- & gt;MoveFirst();

if (! pRstAuthors- & gt;EndOfFile)
{

while (! pRstAuthors- & gt;EndOfFile)
{
valField1 = pRstAuthors-&ГТ;поля-и GT;метод getitem("логин")-и GT;значение.intVal;
}
}
}
catch(_com_error & ce)
{
//се.Описание;
MessageBoxA(NULL, "hello", "hello", 0);
//sprintf ("ошибка:%s\n", ce.Описание);
}
CoUninitialize();
}

CDatabaseHandler::~CDatabaseHandler(void)
{

}
void CDatabaseHandler::fnCallback()
{



}


это один из классов проекта win32.При подаче заявки start.it был вызван.
Над кодом работало консольное приложение,но тот же код не работал в приложении win32.

Jochen Arndt

Затем проверьте, где находятся различия между этими двумя версиями. Ошибка "не зарегистрирована" не связана с типом проекта (кроме уже упомянутой 32/64-битной проблемы).