Рейтинг:
2
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-битной проблемы).