Dao
CDaoDatabase *m_Base;
m_Base=new CDaoDatabase();
m_Base->Open(C:\myBase.mdb);
int MyTables=m_Base->GetTableDefCount();
так вот перед тем как этот код выполнить я создаю базу данных с двумя таблицами (программно через DAO). Если я не буду открывать базу данных (вне программы) через Access2000 то значение
MyTables будет 6. Если сначала открыть базу а потом выполнить код то значение MyTables будет 7
(размер файла базы данных после открытия увеличится хотя сами данные в таблицах не изменятся(вероятно Access производит какие-то преобразования с файлом)). Так как мне получит действительное число таблиц в базе не зависимо от того открывалась ли ранее база. Для создания программы используется VC++(6.0)
Поэтому, если не создавать таблиц с именами на MSys, то следующий код будет давать nTables = числу пользовательских таблиц:
pBase = new CDaoDatabase();
pBase->Open("c:\\work\\access\\db1.mdb");
int nTables = 0;
CDaoTableDefInfo tdi;
for (int i = 0; i < pBase->GetTableDefCount(); i++)
{
pBase->GetTableDefInfo(i, tdi);
nTables += strncmp("MSys", tdi.m_strName, 4);
}
delete pBase;
Access создаёт системные таблицы. Все они имеют имена MSys*, по крайней мере, во всех нынешних версиях MS Access.
Поэтому, если не создавать таблиц с именами на MSys, то следующий код будет давать nTables = числу пользовательских таблиц:
Да я и сам думал подсчитать таблицы в цикле, только не таким способом. В приведенном коде мне непонятно использование функции strncmp(...)
В справке написана такая вещь: strncmp(char *str1,char *str2,int kol)
сравнивает kol символов из 2-х строк. и возвращает -1 если str1>str2 0 если str1=str2 и 1 если str1<str2 (точно не помню). Тогда становится не понятно как понять пользователь создал таблицу или там еще какая то таблица.
... В приведенном коде мне непонятно использование функции strncmp(...)
...
Прошу прощения, конечно, это ошибка. Должно быть
Прошу прощения, конечно, это ошибка. Должно быть
Этот код подсчитывает количество системных файлов.
Этот код подсчитывает количество системных файлов.
Да, и тут вы, конечно, правы... думаю, абсолютно правильный вариант решения лучше попросить сделать Mongoose'а.
Да, и тут вы, конечно, правы... думаю, абсолютно правильный вариант решения лучше попросить сделать Mongoose
С Вас 2х20 копеек :roll:
:)
С Вас 2х20 копеек :roll:
:)
Ура! решение найдено!
На самом деле по-сишному должно быть
nTables += strncmp("MSys", tdi.m_strName, 4) != 0;
А насчёт 20 копеек я против. Это мой личный копирайт уже много лет. Требуйте 20 центов, или пенсов, или евроцентов, или чего-нибудь там ещё, но копейки мои ;) Это святое.
Ура! решение найдено!
На самом деле по-сишному должно быть
nTables += strncmp("MSys", tdi.m_strName, 4) != 0;
А насчёт 20 копеек я против. Это мой личный копирайт уже много лет. Требуйте 20 центов, или пенсов, или евроцентов, или чего-нибудь там ещё, но копейки мои ;) Это святое.
Какие вы все меркантильные надо все делать за спасибо. Да и решение я все равно не понял при чем здесь !=0 где тогда if. К тому же как я уже писал strncmp проверяет по ходу количество символов(иначе как тогда понимать str1>str2) значит если в базе имеется 2 таблицы(пользовательские с именами "MS","MYSYS1") то nTables будет=0 тк в одном случае strncmp вернет 1 а в другом -1
...
Да и решение я все равно не понял...
...
Блин, а мы-то тут блох ловим, а вы-то C не знаете. Ладно, расскажу. Работает всё примерно так.
- strncmp() возвращает 0, если строки одинаковые. Иначе возвращает не 0.
- strncmp() != 0 возвращает 1, если strncmp() вернула не 0 (т.е. строки были разные). Иначе операция != вернёт 0.
- Эта 1 или 0 прибавляется к nTables.
Блин, а мы-то тут блох ловим, а вы-то C не знаете. Ладно, расскажу. Работает всё примерно так.
- strncmp() возвращает 0, если строки одинаковые. Иначе возвращает не 0.
- strncmp() != 0 возвращает 1, если strncmp() вернула не 0 (т.е. строки были разные). Иначе операция != вернёт 0.
- Эта 1 или 0 прибавляется к nTables.
да но в справке написано что функция возвращает кроме нуля и 1 еще и -1(сколько можно писать) В общем теперь проблема состоит в том что длина имени пользовательской таблицы может быть меньше 4
да но в справке написано что функция возвращает кроме нуля и 1 еще и -1(сколько можно писать) В общем теперь проблема состоит в том что длина имени пользовательской таблицы может быть меньше 4
Так как есть шанс на то, что sq_deep прочитав твой пост на некоторое время потеряет дар речи, попробую я ответить.
strncmp() возвращает -1, 0, 1. Тогда
strncmp(...)==-1 имеем -1!=0 получаем 1 и nTables +=1;
strncmp(...)== 0 имеем 0!=0 получаем 0 и nTables +=0;
strncmp(...)== 1 имеем 1!=0 получаем 1 и nTables +=1;
Что касается длины имени полей, какое это имеет значение?
strncmp("MSys", tdi.m_strName, 4) сравнивает МАКС 4 символа.
Так как есть шанс на то, что sq_deep прочитав твой пост на некоторое время потеряет дар речи, попробую я ответить...
Спасибо Вам, Mоngооsе:!!!: Я уже устал от этого обсуждения. Спасибо за поддержку:!!!: С меня 20 копеек. Дайте свой e-mail. Вышлю немедленно.
Единственное... я тут что-то засомневался... эээ... может, это CyberMan нас с Вами с первым апреля поздравляет таким образом? Что ж, если так, то шутка действительно хорошая :roll: :D
Спасибо Вам, Mоngооsе:!!!: Я уже устал от этого обсуждения. Спасибо за поддержку:!!!: С меня 20 копеек. Дайте свой e-mail. Вышлю немедленно.
Единственное... я тут что-то засомневался... эээ... может, это CyberMan нас с Вами с первым апреля поздравляет таким образом? Что ж, если так, то шутка действительно хорошая :roll: :D
Та не. Я думаю, его кто-то (может начальник) расстроил, и он решил нам выдать свои нервы. :)
Та не. Я думаю, его кто-то (может начальник) расстроил, и он решил нам выдать свои нервы. :)
Никто меня не расстраивал просто каждый имеет право на тормоз( при программировании я не часто использую булевы операции(в таком виде(только в условиях и циклах)) поэтому юмора я не сразу понял). Так нормально работает спасибо что объяснили что куда.