Базы данных WindowsCE
От: AntonGr  
Дата: 08.07.09 04:44
Оценка:
Здравствуйте, мне надо сделать в WindowsCE работу с базой данных. Я использую API функции типа CeOpenDatabaseEx2, CeCreateDatabaseEx2 и т.д. Вот на таком коде остановился сейчас.


CEDBASEINFOEX ceDBInfo;
CEGUID pceguid;
CEOID ceDB;

HANDLE OpenDB(wchar_t DBName[32])
{
    // Формируем имя создаваемой базы
    // Получаем хэндл выполняемого модуля
    HMODULE hModule = GetModuleHandle(NULL);
    // Вытаскиваем имя файла
    wchar_t wcFileName[64];
    DWORD dwFileNameLen = GetModuleFileName(hModule, wcFileName, 64);

    // Ищем где находится последний символ "/"
    for(int i=((int)dwFileNameLen-1); i>-1; i--)
        if(wcFileName[i] == 0x5c)
            dwFileNameLen = i;

    // Формируем имя создаваемой базы
    for(i=0; i<((int)wcslen(DBName)+1); i++)
        wcFileName[i+(int)dwFileNameLen+1] = DBName[i];
    
    // Добавляем расширение
    wcFileName[i++] = 0x2e;
    wcFileName[i++] = 0x63;
    wcFileName[i++] = 0x64;
    wcFileName[i++] = 0x62;
    wcFileName[i++] = 0x00;

    // Создаем ceguid который ни с кем не связан
    CREATE_INVALIDGUID(&pceguid);
    
    #ifdef _DEBUG
        DWORD dwErr;
    #endif

    // Монтируем том базы данных
    if(!CeMountDBVol(&pceguid,wcFileName,OPEN_ALWAYS))
    {
        #ifdef _DEBUG
            dwErr = GetLastError();
        #endif
        return INVALID_HANDLE_VALUE;
    }

    // Обнуляем память, которая хранит информацию о базе
    ZeroMemory(&ceDBInfo, sizeof(CEDBASEINFOEX));
    // Заносим некоторые параметры
    ceDBInfo.wVersion = 1;
    ceDBInfo.dwFlags = CEDB_VALIDNAME;
    //swprintf(ceDBInfo.szDbaseName, L"%s", wcFileName);
    swprintf(ceDBInfo.szDbaseName, L"\\test.cdb", wcFileName);    
    ceDBInfo.dwSize = sizeof(CEDBASEINFOEX);

    ceDB = 0;
    // Создаем базу
    ceDB = CeCreateDatabaseEx2(&pceguid,&ceDBInfo);
    #ifdef _DEBUG
        dwErr = GetLastError();
    #endif
    if(!ceDB && GetLastError() != ERROR_DUP_NAME)
    {
        #ifdef _DEBUG
            dwErr = GetLastError();
        #endif
        return INVALID_HANDLE_VALUE;
    }

    // Открываем базу для работы
    HANDLE hDB = INVALID_HANDLE_VALUE;
    //hDB = CeOpenDatabaseEx2(&pceguid,&ceDB,wcFileName,0,CEDB_AUTOINCREMENT,NULL);
    hDB = CeOpenDatabaseEx2(&pceguid,&ceDB,L"\\test.cdb",0,CEDB_AUTOINCREMENT,NULL);
    if(hDB == INVALID_HANDLE_VALUE)
    {
        #ifdef _DEBUG
            dwErr = GetLastError();
        #endif
        return INVALID_HANDLE_VALUE;
    }
    
    return hDB;
}

int main(int argc, char *argv[])
{
    HANDLE hDB = INVALID_HANDLE_VALUE;
    hDB = OpenDB(L"test");
    if((HANDLE)hDB != INVALID_HANDLE_VALUE)
        printf("DB opened.\n");
    else
    {
        printf("DB NOT opened.\n");
        return -1;
    }
    printf("%d\n" , ceDBInfo.dwNumRecords);

    //ceDB = (CEOID)SeekDB(hDB, CEDB_SEEK_BEGINNING, 0);
    //if(ceDB == NULL && GetLastError() != ERROR_SEEK)
    //    return -1;

    CEPROPVAL NewProp[2];
    NewProp[0].propid = CEVT_I2;
    //NewProp[0].wLenData = 0;
    //NewProp[0].wFlags = 0;
    NewProp[0].val.iVal = 11;
    NewProp[1].propid = CEVT_I2;
    //NewProp[1].wLenData = 0;
    //NewProp[1].wFlags = 0;
    NewProp[1].val.iVal = 12;
    ceDB = CeWriteRecordProps(hDB, 0, 2, NewProp);

    DWORD test = GetLastError();
    CloseHandle(hDB);

    //CeDeleteDatabaseEx(&pceguid,ceDB);

    test = GetLastError();

    return 0;
}


Указатель на базу возвращается нормально. Вообще вся функцмя OpenDB нормально работает, без ошибок, а вот после выполения ceDB = CeWriteRecordProps(hDB, 0, 2, NewProp) в переменную test попадает ошибка ERROR_MOD_NOT_FOUND(126). Подскажите, в чем может быть проблема. Может я чего-то не понял в работе с базой?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.