Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
MLF
1

Visual C++ и БАЗА, если база устарела?

16.10.2007, 05:44. Показов 1745. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Проект работает с базой (База в Access, проект в основном на Visual C++ 6.0, прога->база через ODBC). Очевидно, что база постоянно изменяется (то поле, то таблица, но общая структура остается неизменной...). Естественно, при запуске программа падает, т.к. все запросы ориентированы на старую базу.
Необходимо, чтобы прога анализировала текущую базу, сравнивала ее со старой (т.е. хранится некий 'слепок' базы) и делала выводы:
- что изменилось (если изменилось);
- если изменения 'легкие' (т.е. нужен критерий изменений), то подкорректировать базу под старую;
- если изменения 'тяжелые', культурно сказать - 'работать не буду, в базе ковыряйся сам'.

Несколько попыток решить эту задачу:
1) В Access есть некие системные таблицы, поковырявшись в них нашел тольок запросы и связи, но не нашел структуру базы, жаль... А так можно было сделать 'слепок базы'. Есть некое приложение msqr386.exe, которое показывает полную структуру базы и не только, полезная вещь...
2) В ручную в проге писать ох.., хм, т.е. большой запрос на всю базу 'ALTER TABLE', если где-то не сходится, анализировать степень изменений и вперед CREATE шо надо заного... но тут тоже надо подумать...

Если у кого есть наработки по этой теме или чему-нить похожему, откликнитесь.
P.S.: даже мыло оставлю - mlf@hotbox.ru
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.10.2007, 05:44
Ответы с готовыми решениями:

База данных и MS VISUAL C++ 5.0
Вопрос: Передо мной задача, - имеется диалоговое окно с CPropertySheets, с CEdit объектами,...

Подвисла сессия, одно поле удалено, база для чтения, непонятные проблемы разделенная база под терминалом remoteAPP
В общем есть сервер win 2008 R2 Enterprise Баз лежит на сервере к ней подключаются юзвери : на...

Visual studio + MySQL База
В общем создал я базу.. в ней 5 таблиц.. в студии создаю windows приложение.. эти 5 таблиц...

База данных в Visual Basic 6
Добрый всем день! Вопрос состоит в следующем : я новичок и создаю прикладное приложение в Visual...

2
7 / 7 / 12
Регистрация: 13.02.2007
Сообщений: 1,255
24.10.2007, 20:03 2
А ты не пробовал провернуть решение (solution) одной известной компании - 1С. Если база действительно настолько динамична, то оно в самый раз подойдет. Но это ближе к проектированию моделей СУБД, чем по VC++

Но задача действительно интересная!

С уважением, Владимир.
0
0 / 0 / 1
Регистрация: 04.11.2007
Сообщений: 35
04.11.2007, 18:07 3
Лучший ответ Сообщение было отмечено как решение

Решение

Я делал это на основе SQLColumns (извиняюсь, выдрал куски из своего проекта):
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
int GetTableInfo() {
    /* Declare buffers for result set data */
//  SQLCHAR       szCatalog[STR_LEN], szSchema[STR_LEN];
    SQLCHAR       szTableName[STR_LEN], szColumnName[STR_LEN], szTypeName[STR_LEN];
//  SQLCHAR       szRemarks[REM_LEN];
//  SQLCHAR       szColumnDefault[STR_LEN], szIsNullable[STR_LEN];
//  SQLINTEGER    ColumnSize, BufferLength, CharOctetLength, OrdinalPosition;
//  SQLSMALLINT   DataType, DecimalDigits, NumPrecRadix, Nullable;
//  SQLSMALLINT   SQLDataType, DatetimeSubtypeCode;
    SQLRETURN     retcode;
    SQLHSTMT      hstmt;
 
    /* Declare buffers for bytes available to return */
//  SQLINTEGER cbCatalog, cbSchema;
    SQLINTEGER cbTableName, cbColumnName, cbTypeName;
//  SQLINTEGER cbDataType, cbColumnSize, cbBufferLength;
//  SQLINTEGER cbDecimalDigits, cbNumPrecRadix, cbNullable, cbRemarks;
//  SQLINTEGER cbColumnDefault, cbSQLDataType, cbDatetimeSubtypeCode, cbCharOctetLength;
//  SQLINTEGER cbOrdinalPosition, cbIsNullable;
 
    nDef = 0;
 
    if ((retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt)) != SQL_SUCCESS) {
        DisplayError(retcode, SQL_HANDLE_DBC, hdbc);
        return 0;
    }
    retcode = SQLColumns(hstmt,
         NULL, 0,                /* All catalogs */
         NULL, 0,                /* All schemas */
//         table, SQL_NTS,   /* CUSTOMERS table */
         NULL, SQL_NTS,         /* all tables */
         NULL, 0);               /* All columns */
 
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
        /* Bind columns in result set to buffers */
//      retcode = SQLBindCol(hstmt, 1, SQL_C_CHAR, szCatalog, STR_LEN,&cbCatalog);
//      retcode = SQLBindCol(hstmt, 2, SQL_C_CHAR, szSchema, STR_LEN, &cbSchema);
        retcode = SQLBindCol(hstmt, 3, SQL_C_CHAR, szTableName, STR_LEN,&cbTableName);
        retcode = SQLBindCol(hstmt, 4, SQL_C_CHAR, szColumnName, STR_LEN, &cbColumnName);
//      retcode = SQLBindCol(hstmt, 5, SQL_C_SSHORT, &DataType, 0, &cbDataType);
        retcode = SQLBindCol(hstmt, 6, SQL_C_CHAR, szTypeName, STR_LEN, &cbTypeName);
//      retcode = SQLBindCol(hstmt, 7, SQL_C_SLONG, &ColumnSize, 0, &cbColumnSize);
//      retcode = SQLBindCol(hstmt, 8, SQL_C_SLONG, &BufferLength, 0, &cbBufferLength);
//      retcode = SQLBindCol(hstmt, 9, SQL_C_SSHORT, &DecimalDigits, 0, &cbDecimalDigits);
//      retcode = SQLBindCol(hstmt, 10, SQL_C_SSHORT, &NumPrecRadix, 0, &cbNumPrecRadix);
//      retcode = SQLBindCol(hstmt, 11, SQL_C_SSHORT, &Nullable, 0, &cbNullable);
//      retcode = SQLBindCol(hstmt, 12, SQL_C_CHAR, szRemarks, REM_LEN, &cbRemarks);
//      retcode = SQLBindCol(hstmt, 13, SQL_C_CHAR, szColumnDefault, STR_LEN, &cbColumnDefault);
//      retcode = SQLBindCol(hstmt, 14, SQL_C_SSHORT, &SQLDataType, 0, &cbSQLDataType);
//      retcode = SQLBindCol(hstmt, 15, SQL_C_SSHORT, &DatetimeSubtypeCode, 0, &cbDatetimeSubtypeCode);
//      retcode = SQLBindCol(hstmt, 16, SQL_C_SLONG, &CharOctetLength, 0, &cbCharOctetLength);
//      retcode = SQLBindCol(hstmt, 17, SQL_C_SLONG, &OrdinalPosition, 0, &cbOrdinalPosition);
//      retcode = SQLBindCol(hstmt, 18, SQL_C_CHAR, szIsNullable, STR_LEN, &cbIsNullable);
        while(TRUE) {
            retcode = SQLFetch(hstmt);
            if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO) {
                DisplayError(retcode, SQL_HANDLE_STMT, hstmt);
            }
            if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
                // Process fetched data 
                strcpy(DBDef[nDef].Table,  szTableName);
                strcpy(DBDef[nDef].Column, szColumnName);
                strcpy(DBDef[nDef].Type,   szTypeName);
                nDef++;
//
0
04.11.2007, 18:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.11.2007, 18:07
Помогаю со студенческими работами здесь

База данных в Visual Basic
Есть база данных в accese её нужно связать в с программой в Visual Basic. Программа в Visual Basic...

База данных Visual Prolog v.5.2
Доброго времени суток. Стоит задача: 1. Создать базу данных о заданной предметной области в виде...

База данных в visual studio 2008
привет, помогите, не пойму как базу данных в visual studio 2008 создать!подскажите!читаю книгу но...

База данных Visual. С чего начать ?
Хочу учить С++. Все советуют Visual++. Что посоветуете вы?

C# Visual studio + база данных (Аccess)
у меня есть база данных с названием voprosi в ней 4 столбца 1 №Вопроса 2 Вопрос 3 Варианты 4 Ответ...

Access и Visual Basic (база данных не открывается)
Подскажите пожалуйста, почему может не открываться свойство Datasource в объекте Data из базы...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru