Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Базы данных > Access&&cpp |
Автор: xkill 31.1.2007, 07:04 |
Просмотрел темы связаные с моей, где-то говорится, что ADO устарело в другой ни одной строчки кода и т.д. По-этому возник вопрос, ситуация такая: Чистый проект, в папке с ним лежит файл file.mdb. Файл БД Access'овский(2003). Среда BCB6.0. И возникает вопрос как общаться с этой БД, какие компоненты использовать, какие настройки следует производить? |
Автор: Anikmar 31.1.2007, 12:31 |
На счет того, что ADO устарело ни разу не слышал, может и так. А вот то, что BDE перестает поддерживаться Борландом слышал неоднократно. Я начинал с компонентов BDE. В принципе разобраться легко, работать тоже, но требует настройки при переносе на компьютер пользователя. Это конечно решаемо, но при сравнительных тестах на больших базах ADO практически всегда оказывается быстрее. Исключение составил тест на простой перебор записей. Поэтому я перешел на ADO. С ADO мне показалось работать гораздо комфортнее по многим критериям. ИМХО Для поставленной задачи я бы выбрал ADO |
Автор: Любитель 31.1.2007, 14:35 |
Согласен. |
Автор: xkill 31.1.2007, 16:41 |
Вроде разобрался с тем как подконнектится к ODBC через ado. Но тут возник вопрос, а как выполнять запросы(через какую функцию)? ![]() |
Автор: Anikmar 31.1.2007, 17:46 |
Примеров использования TADOQuery на форуме просто море. Создается ADOConnection Бросается компонент TADOQuery В этом компоненте устанавливается свойство SQL - это запрос Если запрос на выборку - то к TADOQuery подключается TDataSet, через который можно отображать в TDBGrid и т.п. |
Автор: xkill 4.2.2007, 12:52 | ||
компонент TADOuery. (использую ODBC, а бд Access'овская) Встретил проблемку:
Как можно дальше работать(всмысле какие настройки, функци использовать), т.к. каждый раз через переборку значений слишком много времени будет уходить ??? ![]() ![]() ![]() |
Автор: Anikmar 4.2.2007, 13:05 | ||
Надо посмотреть результирующий запрос - скорее всего все-таки он неправильный. Конкретно для посавленной задачи можно использовать параметризированный запрос. SELECT * FROM Name WHERE id = :pIdi Кстати, Name возможно зарезевированное слово и его надо взять в квадратные скобки (точно не помню) С параметризированным запросом работа строится так:
|
Автор: bas 5.2.2007, 10:11 |
А текст ошибки, "военная тайна"? |
Автор: xkill 5.2.2007, 19:38 | ||
bas, забыл про такую вещь)
А что за параметры ему требуются? |
Автор: Anikmar 5.2.2007, 19:47 |
Надо посмотреть результирующий запрос. Мне кажется он какой-то неправильный. Попробуйте выбрать все записи: SELECT * FROM MyTable Сработает такой запрос? |
Автор: xkill 5.2.2007, 21:39 | ||||||||
Anikmar, работал я раньше с мускулем, там такой вопрос без проблемно обратывается (сейчас убедился ещё раз). Посмотрев в справке по access'у, пример:
Решил проверить методов "заковычивания" ))) И всё без проблем получилось:
И так он перестал ругаться) Но почему-то он не выбирает данные(query->recordcount, равен 0! ![]() ![]() ![]() Дальше пошло ещё интереснее При запросе
В recordcount был равен всем записям,когда же при запросе:
recordcount был равен нулю опять, вместо положенных 4-х p.s. фиг поймёшь филосовию access'овского sql'я ![]() ![]() ![]() ![]() |
Автор: Anikmar 5.2.2007, 22:34 | ||
А какой тип поля у id? Ведь конструкция 'id' = '5' никода не будет истина - там сравниваются две строки... Не должно быть там никаких кавычек! Добавлено @ 22:40 Для интереса запустил access и сгенерил запрос в нем (используя борландский пример базы) Вот что он мне сгенерил с помощью своего построителя запросов:
Может там все дело в скобках? |
Автор: xkill 6.2.2007, 08:29 | ||
Тип у id числовой Вообщем в where условия поместил в скобки и всё встало на свои места)
феноменально) При этом в справке несказано про скобки (в инстуркции по select) Какие функции спользуются в DBGrid для обавления записей? |
Автор: Anikmar 6.2.2007, 09:58 |
Во-первых там есть автоматическое создание записей, но такое создание криво работает с полями подстановки. Я делал 2 путями. 1-й: Запрос вида SELECT * FROM Table Далее MyQuery->Insert(); Устанавливаем поля MyQuery->Post(); 2-й (на мой взгляд более трудоемкий но более правильный) Запрос вида INSERT INTO Table (Field1,Field2) VALUES(:pField1,:pField2) Устанавливаем параметры выполняем MyQuery->ExecSQL(); Еще есть способ использовать UpdateSQL - но в ADO такого нет, это только для BDE |
Автор: bas 6.2.2007, 11:52 |
DBGrid - Никаких. http://delphiworld.narod.ru/base/db_cursors_in_ado.html Добавлено @ 11:53 Cсогласен еще добавлю update |
Автор: Anikmar 6.2.2007, 13:41 |
Естественно. Но вопрос звучал как: ![]() А так в SQL еще много замечательных команд. Можно создавать базы, таблицы, и т.п. |
Автор: xkill 9.2.2007, 10:15 | ||
Есть функция:
Проблема заключается в том что функция после первого вызова действует нормально), а если её вызвать 2-ой,3-й и т.д. раз, то счётчик возращает корректное значение, а далее где добавляются поля (цикл), значения полей все прежние. (а где должны быть новые, там пустое значение, а стары на месте) ЗЫ Думаю стуацию описал. ЗЫ2 Ошибок не выдает. |
Автор: Anikmar 9.2.2007, 11:19 |
Надо бы очистить сетку перед перевыводом. А то каждый раз добавляем и добавляем поля... А DBGrid для этих целей совсем не подходит? Там вообще ничего делать не придется практически... |
Автор: xkill 9.2.2007, 11:32 |
Anikmar, а как очистить? Сейчас много сделано на StringGrid, и перехода к DBGrid думамю будет не оправданым, в том плане, что делать много предется заново + данный компонент изучать |
Автор: Anikmar 9.2.2007, 11:34 |
Я очищал - просто ставил количество строк 0 (сам очищается), а потом возвращал нужное значение - строки будут пустые. Но там насколько я помню есть с ним косяк когда надо заголовки вывести. Небольшой баг в компоненте, в какой-то из книг даже описанный. Поэкспериментируете - поймете о чем речь. |
Автор: xkill 9.2.2007, 11:55 |
Anikmar, можешь пример привести? Или через какое значение это изменяется? |
Автор: Anikmar 9.2.2007, 11:57 |
Ты же сам это делаешь! Сначала присвой 0, а потом нужное значение. |
Автор: xkill 9.2.2007, 12:10 | ||
Anikmar, произшло не допонимание) С StringGrid'ом у мну всё хорошо. Проблема то сама заключается в TQuery, там на моменте:
И тем самым получается, что после второго вызова функции(перед этим в таблицу вставлялись данныйе) строчки в StringGrid'e появляются, но почему-то в Form1->query->FieldByName("5")->AsString являются пустыми(но ещё содержать результат первого запроса). Т.к. в StringGrid'е содержаться данные первой выборки. => в StringGrid'е проблемы нет. А она в Tquery PS Надеюсь стуацию обрисовал лучше |
Автор: Anikmar 9.2.2007, 12:15 |
А в самой базе эти строчки есть? |
Автор: xkill 9.2.2007, 12:26 |
Anikmar, есть они добавляются без проблем, т.к. в Form1->StringGrid1->RowCount=max; Они появляются пустые строчки. Плюс смотрел через phpmyadmin ни каких проблем со стороны добавления тоже нет. |
Автор: Anikmar 9.2.2007, 12:33 |
Т.е. в базе строчки есть В запросе строчки есть. Form1->query->FieldByName("1")->AsString содержит нормальное значение? Form1->StringGrid1->Rows[i]->Add(Form1->query->FieldByName("1")->AsString); Я так понимаю эта команда добавляет в строку очередной столбец? |
Автор: xkill 9.2.2007, 12:48 |
Да, в базе строчки есть, в запросе строчки есть (count вовзращает корректное число строчек) Если заменить Form1->StringGrid1->Rows[i]->Add("то эта надпись появится во всем столбце "); При этом когда вызыватся данная функция кол-во строк в StringGrid увеличивается(так и должно быть, т.к. данные добавляются) При этом где должны быть новые значения их там нету(хотя после перезапуска программы все он появляются как надо), но строчки добавляются за счёт счётчика. При замене одного на Form1->StringGrid1->Rows[i]->Add("то эта надпись появится во всем столбце ");, то надпись действительно появляется везде. |
Автор: Anikmar 9.2.2007, 13:15 |
Честно говоря, не понимаю с ходу в чем проблема. Для проверки - кинь на форму в уголок DBGrid, привяжи его к этому запросу и посмотри что он выведет. Если выведет правильно - значит дело в заполнении StringGrid. Если тоже будет пустой - значит что-то с запросом не так. |
Автор: Anikmar 9.2.2007, 13:53 | ||
Я немного переделал твой код, чтобы он был более "легким в понимании"
Я убрал подсчет количества строк - в TADOQuery есть свойство RecordCount. Когда работал через BDE 1 раз у меня были с ним проблемы, но выловить повторно не смог, так что полезное свойство, содержит количество фактических строчек в запросе. |
Автор: xkill 9.2.2007, 14:49 |
Anikmar, сть одна проблемка и она заключатся в том что использовал компонент TSQLQuery ( в месте с MySQL) А DBGrid в настройках где DataSource: Operation not allowed on a unidirectional dataset. И как её привизать к запросу? |
Автор: Rodman 9.2.2007, 14:57 |
есть компонент ТDataSource, его свяжи между TDBGrid и TQuery... |
Автор: Малинка 1.3.2007, 13:11 |
Ребята, я девушка не глупая и тем не менее мне требуется Ваша помощь, необходимо написать ПО в Builder для заполнения БД Access из бинарного файла. БД создана. Помогите. Добавлено @ 13:13 Ребята, я девушка не глупая и тем не менее мне требуется Ваша помощь, необходимо написать ПО в Builder для заполнения БД Access из бинарного файла. БД создана. Помогите. |
Автор: Малинка 1.3.2007, 23:13 |
Ребята, я девушка не глупая и тем не менее мне требуется Ваша помощь, необходимо написать ПО в Builder для заполнения БД Access из бинарного файла. БД создана. Помогите. |