Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2009, 15:54   #1
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию база данных

написал небольшую программку (из книжки Культина), но как там написано - не работает. выдаёт ошибку вероятно опечатка.
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <oleauto.hpp>
#include "Unit2.cpp"
#pragma hdrstop

#include "base1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormActivate(TObject *Sender)
{
        try
        {
                ADOConnection1->Open();
                ADODataSet1->Active=true;
        }
        catch (Oleauto::EOleException &e)
        {
                MessageDlg("Ошибка лоступа к базе данных.\n"+e.Message, mtError, TMsgDlgButtons()<<mbOK,0);
                DBGrid1->Enabled=false;
        }
        
}
//---------------------------------------------------------------------------


void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
        if (DBGrid1->EditorMode==true)//пользователь не завершил редактирование
        {
        //сохранить редактируемую запись
        ADODataSet1->UpdateBatch(arCurrent);
        ADODataSet1->Close();
        }        
}
//---------------------------------------------------------------------------



void __fastcall TForm1::Button1Click(TObject *Sender)
{
        Form2->ShowModal();
        if (Form2->ModalResult==mrOk)
        {
        //пользователь ввёл критерий запроса
        //и нажал кнопку ОК
        //ADODataSet1->Close();
        ADODataSet1->CommandText=" SELECT * FROM Contacts WHERE Name Like  \%34"+Form2->Edit1->Text+"%\34";
        //отладочная печать
        ShowMessage (ADODataSet1->CommandText);//показать SQL-команду
        }
        ADODataSet1->Open();
        if (ADODataSet1->RecordCount==0)
        {// в базе данных нет записей, удовлетворяющих критерию запроса
                ADODataSet1->Filtered=false;
                ShowMessage("В базе данных нет записей, удовлетворяющих критерию запроса") ;
        }
}


        

//---------------------------------------------------------------------------


void __fastcall TForm1::Button2Click(TObject *Sender)
{

        ADODataSet1->Close();
        ADODataSet1->CommandText=" SELECT * FROM CONTACTS ORDER BY Name";
        ADODataSet1->Open();
                
}
//---------------------------------------------------------------------------
сама ошибка заключается в этом месте: ADODataSet1->CommandText=" SELECT * FROM Contacts WHERE Name Like \%34"+Form2->Edit1->Text+"%\34";

Убедительная просьба прокомментировать работу всех операторов функции void __fastcall TForm1::Button1Click(TObject *Sender).
В FormClose непонятно что такое ADODataSet1->UpdateBatch(arCurrent);
и что происходит если DBGrid1->EditorMode==false и когда оно происходит, то есть когда пользователь завершит редактирование??? как-то криво это всё прописано, непонятно.
в Button2Click непонятно
ADODataSet1->Close();
ADODataSet1->CommandText=" SELECT * FROM CONTACTS ORDER BY Name";
ADODataSet1->Open();
зачем сначала закрывать DataSet, потом как-то обращаться к акрытому DataSet, а пото его опять открывать. как-то не так. DataSet ведь отвечает за связь с удалённой базой даннных. так?


на всякий случай загрузил весь проект. ссылка ниже
http://slil.ru/28012309
Dimarik вне форума Ответить с цитированием
Старый 24.09.2009, 22:34   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        // Отобразить Form2 модально (пока её не закроешь,
        // Form1 не активируешь)
        // Всякие OpenDialog так открываются, например
        Form2->ShowModal();
        // Если там нажали ОК (У кнопок свойство есть соответствующее.
        // У ОК ставят mrOK, у Cancel - mrCancel, хотя это не принципиально)
        if (Form2->ModalResult==mrOk)
        {
        //пользователь ввёл критерий запроса
        //и нажал кнопку ОК
        //ADODataSet1->Close();
        // Запрос к БД
        ADODataSet1->CommandText=" SELECT * FROM Contacts WHERE Name Like  %\34"+Form2->Edit1->Text+"%\34";
        //отладочная печать
        ShowMessage (ADODataSet1->CommandText);//показать SQL-команду
        }
        // Открываем набор данных, т.е. выполняем запрос
        ADODataSet1->Open();
        // Запрос вернул ноль записей
        if (ADODataSet1->RecordCount==0)
        {// в базе данных нет записей, удовлетворяющих критерию запроса
                // Отключаем локальную фильтрацию
                ADODataSet1->Filtered=false;
                ShowMessage("В базе данных нет записей, удовлетворяющих критерию запроса") ;
        }
}
Цитата:
Сообщение от Dimarik Посмотреть сообщение
В FormClose непонятно что такое ADODataSet1->UpdateBatch(arCurrent);
Это подтверждение изменений текущей записи. Вроде бы то же самое должен делать метод Post (По крайней мере я его всегда использовал для этого: ADODataSet1->Post
Цитата:
Сообщение от Dimarik Посмотреть сообщение
и что происходит если DBGrid1->EditorMode==false и когда оно происходит, то есть когда пользователь завершит редактирование???
Ничего не происходит. DBGrid1->EditorMode == true, если таблица находится в состоянии редактирования, т.е. меняется содержимое какой-то её ячейки. В общем, в FormClose записываются еще незаписанные изменения в БД.

Цитата:
Сообщение от Dimarik Посмотреть сообщение
в Button2Click непонятно
ADODataSet1->Close();
ADODataSet1->CommandText=" SELECT * FROM CONTACTS ORDER BY Name";
ADODataSet1->Open();
зачем сначала закрывать DataSet, потом как-то обращаться к акрытому DataSet, а пото его опять открывать. как-то не так. DataSet ведь отвечает за связь с удалённой базой даннных. так?
Ну я бы не сказал, что он за связь отвечает... CommandText - это запрос на выборку данных. Пишем Open - выполняем запрос. Закрывать нужно, т.к. изменение запроса для открытого набора данных может (а может и полюбому так будет. я уже не помню) вылиться в исключение. В общем, правильно: закрыть, изменить запрос, открыть, иначе могут быть проблемы.
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
База данных Orme БД в Delphi 0 17.09.2009 18:23
С++. База Данных redevil Помощь студентам 3 08.07.2009 22:23
База данных Rebel123 БД в Delphi 4 21.06.2009 01:00
База данных D_A Паскаль, Turbo Pascal, PascalABC.NET 2 13.04.2009 20:15
База Данных xxasb07 Помощь студентам 2 09.12.2008 17:25