Під час використання бази даних MFC DAO класів, там можуть бути ситуації, де це необхідно, використовувати DAO безпосередньо. Звичайно, це не буде так, але MFC надав деякі helper механізмів для полегшення робить прямий DAO дзвінки простий, коли поєднання використання MFC класи з прямим DAO дзвінки. Робить прямий DAO дзвінки на методи об'єкта керування MFC DAO повинен вимагають лише кілька рядків коду. Якщо потрібно створити й використовувати DAO об'єкти, які не керує MFC, вам доведеться зробити трохи більше роботи за фактично реліз на об'єкті. Цей технічне Примітка пояснює, коли ви можете зателефонувати DAO безпосередньо, що MFC помічники можна зробити, щоб допомогти вам і як використовувати DAO OLE інтерфейси. Нарешті, ця Примітка надає деякі функції приклад показує, як назвати DAO безпосередньо для функції безпеки DAO.
Найбільш типові з них для прийняття прямий DAO дзвінки виникають, коли колекцій потрібно оновити, або коли ви здійснюють функції не загорнуті на MFC. Найбільш Суттєвою особливістю, що не піддаються на MFC є забезпечення безпеки. Якщо ви хочете, щоб здійснювати функції безпеки, потрібно буде використовувати DAO користувачів і груп об'єктів безпосередньо. Крім безпеки є тільки кілька інших DAO функції не підтримуються MFC. До них відносяться набір записів клонування і бази даних реплікації функцій, а також кілька пізно доповнення до DAO.
MFC, обтікання DAO робить використання DAO легше з обробки багато деталі, так що вам не доведеться турбуватися про дрібниці. Це включає в себе ініціалізації OLE, створення і управління об'єктів DAO (особливо колекції об'єкти), помилка перевірки та надання сильно ввели, простіше інтерфейс ( варіант або БУЛ аргументів). Можна зробити прямий DAO дзвінки і все ще скористатися цими функціями. Все, що потрібно зробити ваш код є заклик реліз будь-які об'єкти, створені за прямим DAO дзвінки і не змінювати будь-який інтерфейс покажчиків, що MFC можуть покладатися на внутрішньо. Наприклад, не змінюйте відкрити об'єкт CDaoRecordset , член m_pDAORecordset , якщо ви розумієте всі внутрішні наслідки. Однак, використовуйте m_pDAORecordset інтерфейс для виклику DAO безпосередньо для того, щоб отримати набір полів. У цьому випадку m_pDAORecordset член не будуть змінені. Просто треба зателефонувати реліз поля об'єкта, колекції, після завершення з об'єктом.
Помічники, умови, щоб зробити виклик DAO легше є ж помічників, які використовуються всередині класів MFC бази даних DAO. Ці помічники використовуються для перевірки повернення кодів під прямим DAO дзвінка, журнал налагодження виводу, перевірка очікувані помилки і кидали відповідні винятки, якщо це необхідно. Існують дві основні допоміжні функції та чотири макроси, що карта, щоб один з цих двох помічників. Найкращим поясненням було б просто прочитати код. Див, DAO_CHECK, DAO_CHECK_ERROR, DAO_CHECK_MEMі DAO_TRACE в AFXDAO.H переглянути макроси, і подивитися, AfxDaoCheck і AfxDaoTrace в DAOCORE.CPP.
OLE інтерфейсів для кожного об'єкта в ієрархії об'єктів DAO визначаються заголовка файлу DBDAOINT.H, який знаходиться в \Program Files\DevStudio\VC\include директорії. Ці інтерфейси надати методів, які дають змогу маніпулювати всієї ієрархії DAO.
Для багатьох методів у DAO інтерфейси ви повинні маніпулювати БУЛ об'єкт (довжина префіксом рядок використовується в автоматизації OLE). Об'єкт БУЛ зазвичай втілений в рамках варіант тип даних. MFC класу COleVariant , сама успадковує від ВАРІАНТУ тип даних. Залежно від того, чи ви побудувати ваш проект для ANSI або Юнікод ANSI або Юнікод БУЛs повернеться DAO інтерфейсів. Двох макросів, V_BSTR і V_BSTRT, використовуються для забезпечення, що інтерфейс DAO отримує БУЛ очікуваного типу.
V_BSTR розпаковуєте член bstrVal COleVariant. Цей макрос зазвичай використовується, коли потрібно передати вміст COleVariant метод DAO інтерфейсу. Наступний фрагмент коду показує, як декларацій, так і фактичне використання для двох методів ДАО DAOUser інтерфейс, що скористатися V_BSTR макросів:
COleVariant varOldName;
COleVariant varNewName (_T("NewUser"), VT_BSTRT);
/ / Код для призначення pUser припустиме значення пропущено
DAOUser * pUser = NULL;
/ / Ці метод заяви були взяті з DBDAOINT.H
/ / STDMETHOD(get_Name) (THIS_ БУЛ ДАЛЕКИЙ * pbstr) ЧИСТИЙ;
/ / STDMETHOD(put_Name) (THIS_ БУЛ бул) ЧИСТИЙ;
DAO_CHECK (pUser-gt; get_Name (& V_BSTR (і varOldName)));
DAO_CHECK (pUser - > put_Name (V_BSTR (і varNewName)))
Зверніть увагу, що, VT_BSTRT аргументи, зазначені в COleVariant Конструктор вище гарантує, що там буде ANSI БУЛ в COleVariant , якщо ви будуєте ANSI Версія заявку і Uunicode БУЛ Unicode версії вашого застосування. Це те, що очікує DAO.
Інші макрос, V_BSTRT, буде витягувати ANSI або Юнікод bstrVal член COleVariant , залежно від типу побудувати (ANSI або Юнікод). Наступний код демонструє, як отримати БУЛ значення з COleVariant в CString:
COleV&ariant varName (_T ("MyName"), VT_BSTRT);
CString вул = V_BSTRT (amp; varName)
V_BSTRT макрос, разом з інші прийоми, щоб зламати відкритих інших типів, які зберігаються в COleVariant, продемонстрували в DAOVIEW зразка на Visual C++ компакт-диск. Зокрема, цей переклад здійснюється CCrack::strVARIANT способом. Цей метод, де це можливо, перетворює значення, COleVariant на зразок CString.
Можуть виникнути ситуації, коли необхідно оновити основні DAO збору об'єктів. Зазвичай це не повинно бути необхідним, але це проста процедура, якщо це необхідно. Приклад коли колекція може необхідно оновити, коли працює в багатокористувацькому середовищі з кількома користувачами, створення нових tabledefs. У цьому випадку колекції tabledefs може стати застарілою. Щоб оновити збірки, вам просто потрібно зателефонувати оновити метод певної колекції об'єкта і перевірити на наявність помилок:
DAO_CHECK (pMyDaoDatabase-gt;
m_pDAOTableDefs - > Оновити ())
Зверніть увагу, що в даний час всі DAO колекції об'єкт інтерфейси деталей незадокументовані реалізації класів бази даних MFC DAO.
Класи бази даних MFC DAO не обернути функції безпеки DAO. Ви повинні викликати методи DAO інтерфейсів для використання деяких функцій безпеки DAO. Наступні функції встановлює базу даних а потім зміни пароля користувача. Ця функція закликає трьох інших функцій, які згодом визначені.
void ChangeUserPassword( )
{
// Specify path to the Microsoft Access
// system database
CString strSystemDB =
_T( "c:\\Program Files\\MSOffice\\access\\System.mdw" );
// Set system database before MFC initilizes DAO
// NOTE: An MFC module uses only one instance
// of a DAO database engine object. If you have
// called a DAO object in your application prior
// to calling the function below, you must call
// AfxDaoTerm to destroy the existing database
// engine object. Otherwise, the database engine
// object already in use will be reused, and setting
// a system datbase will have no effect.
//
// If you have used a DAO object prior to calling
// this function it is important that DAO be
// terminated with AfxDaoTerm since an MFC
// module only gets one copy of the database engine
// and that engine will be reused if it hasn't been
// terminated. In other words, if you do not call
// AfxDaoTerm and there is currently a database
// initialized, setting the system database will
// have no affect.
SetSystemDB( strSystemDB );
// User name and password manually added
// by using Microsoft Access
CString strUserName = _T( "NewUser" );
CString strOldPassword = _T( "Password" );
CString strNewPassword = _T( "NewPassword" );
// Set default user so that MFC will be able
// to log in by default using the user name and
// password from the system database
SetDefaultUser( strUserName, strOldPassword );
// Change the password. You should be able to
// call this function from anywhere in your
// MFC application
ChangePassword( strUserName, strOldPassword,
strNewPassword );
.
.
.
}
Найближчі чотири приклади демонструють як:
Налаштування бази даних системи
Нижче наводиться зразок функцію набору базу даних для використання застосунком. Ця функція має бути назване робити інші дзвінки DAO.
/ / Встановити базу даних, що в / / пошукової бази даних DAO буде використовувати
недійсним SetSystemDB (CString підсилювача; strSystemMDB)
{
COleVariant varSystemDB (strSystemMDB, VT_BSTRT);
/ / Ініціалізація DAO для MFC
AfxDaoInit ();
DAODBEngine * pDBEngine = (AfxDaoGetEngine);
НАДБАННЯ (pDBEngine! = NULL);
/ / Обслуговування put_SystemDB метод, щоб встановити в / / система бази даних для двигуна DAO
DAO_CHECK (pDBEngine - > put_SystemDB (varSystemDB.bstrVal));
}
Налаштування за замовчуванням користувача і пароль
Щоб встановити за замовчуванням користувача і пароль для бази даних системи, скористайтеся функцією наступні:
втрати SetDefaultUser (CString підсилювача; strUserName, CString & strPassword)
{
COleVariant varUserName (strUserName, VT_BSTRT);
COleVariant varPassword (strPassword, VT_BSTRT);
DAODBEngine * pDBEngine = (AfxDaoGetEngine);
НАДБАННЯ (pDBEngine! = NULL);
/ / Встановити за замовчуванням користувача:
DAO_CHECK (pDBEngine - > put_DefaultUser (varUserName.bstrVal));
/ / Встановити пароль за замовчуванням:
DAO_CHECK (pDBEngine - > put_DefaultPassword (varPassword.bstrVal));
}
Зміна пароля користувача
Щоб змінити пароль користувача, слід використовувати функцію наступні:
void ChangePassword( CString &strUserName,
CString &strOldPassword,
CString &strNewPassword )
{
// Create (open) a workspace
CDaoWorkspace wsp;
CString strWspName = _T( "Temp Workspace" );
wsp.Create( strWspName, strUserName,
strOldPassword );
wsp.Append( );
// Determine how many objects there are
// in the Users collection
short nUserCount;
short nCurrentUser;
DAOUser *pUser = NULL;
DAOUsers *pUsers = NULL;
// Side-effect is implicit OLE AddRef( )
// on DAOUser object:
DAO_CHECK( wsp.m_pDAOWorkspace->get_Users( &pUsers ) );
// Side-effect is implicit OLE AddRef( )
// on DAOUsers object
DAO_CHECK( pUsers->get_Count( &nUserCount ) );
// Traverse through the list of users
// and change password for the userid
// used to create/open the workspace
for( nCurrentUser = 0; nCurrentUser < nUserCount;
nCurrentUser++ )
{
COleVariant varIndex( nCurrentUser, VT_I2 );
COleVariant varName;
// Retrieve information for user nCurrentUser
DAO_CHECK( pUsers->get_Item( varIndex, &pUser ) );
// Retrieve name for user nCurrentUser
DAO_CHECK( pUser->get_Name( &V_BSTR( &varName ) ) );
CString strTemp = V_BSTRT( &varName );
// If there is a match, change the password
if( strTemp == strUserName )
{
COleVariant varOldPwd( strOldPassword,
VT_BSTRT );
COleVariant varNewPwd( strNewPassword,
VT_BSTRT );
DAO_CHECK( pUser->NewPassword( V_BSTR( &varOldPwd ),
V_BSTR( &varNewPwd ) ) );
TRACE( "\t Password is changed\n" );
}
}
// Clean up: decrement the usage count
// on the OLE objects
pUser->Release( );
pUsers->Release( );
wsp.Close( );
}
Змінювати пароль на.MDB файл
Щоб змінити пароль на.MDB файл, використовуйте наступні функції:
недійсним SetDBPassword (LPCTSTR pDB, LPCTSTR pszOldPassword, LPCTSTR pszNewPassword)
{
nbsp; CDaoDatabase-db;
CString strConnect (_T ("; pwd ="));
/ / бази даних необхідно відкрити як ексклюзивні
/ / встановити пароль
дБ.Відкрийте (pDB, TRUE, FALSE, strConnect + pszOldPassword);
COleVariant NewPassword (pszNewPassword, VT_BSTRT),
OldPassword (pszOldPassword, VT_BSTRT);
DAO_CHECK (db.m_pDAODatabase - > NewPassword (V_BSTR (і OldPassword),
V_BSTR (і NewPassword)));
дБ.Close();
}
Технічні примітки за номером |nbsp; Технічні примітки за категоріями