[H-L-L.ru]

Форма входа

Меню сайта

Categories
Программы с GUI [8]
Создание программ с графическим интерфейсом пользователя

Главная » Статьи » C++ Builder 6 - GUI » Программы с GUI

Базы данных Microsoft Access в C++ Builder 6 с использованием ADO. Часть 3
  В данной статье я собрал основные методы работы с базами данных. Рекомендую работать с англоязычными именами полей без пробелов.

  Запуск приложения базы данных из любого каталога, при условии что и исполняемый файл и база данных находятся в нем:

   String filename = "Название_базы.mdb";
  if(!FileExists(ExtractFilePath(Application->ExeName)+filename))
{
   AnsiString ds = "Файл базы данных не обнаружен \n\n\t" +filename;
   ShowMessage( ds );
}

else
 {
  String WayToBase=ExtractFilePath(Application->ExeName)+filename;

  ADOConnection1->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source="+WayToBase+";Mode=Share Deny None;Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;";

  ADOConnection1->Connected = true;
  ADOTable1->Active = true;
  ADOTable1->Open();
  }


Загрузка изображения формата jpeg из blob - поля в Image:

#include "jpeg.hpp"

 if(!(TBlobField*)ADOTable1->FieldByName("Поле_БД")->IsNull){
 TMemoryStream* strm = new TMemoryStream;
 TJPEGImage *ptJpg=new TJPEGImage;
 ((TGraphicField*)ADOTable1->FieldByName("
Поле_БД"))->SaveToStream(strm);
 strm->Seek(0,0);
 if (*(Word*)strm->Memory == 0xD8FF) Image1->Picture->Graphic=ptJpg;
 Image1->Picture->Graphic->LoadFromStream(strm);
        delete strm;
        delete ptJpg;
      }

 
Загрузка изображения формата jpeg, png, gif, bmp из blob - поля в Image:

#include "jpeg.hpp"
#include "GIFImg.hpp"//нет в C++ Builder 6
#include "PngImage.hpp"//начиная с C++ Builder 2009


TMemoryStream* C = new TMemoryStream();
if ( OpenDialog1->Execute() ) C->LoadFromFile( OpenDialog1->FileName );
C->Seek(0,0);
Graphics::TBitmap* ptBmp = new Graphics::TBitmap;
TJPEGImage *ptJpg = new TJPEGImage;
TGIFImage *ptGif = new TGIFImage;
TPngImage *ptPng = new TPngImage;
ptPng->Assign(ptBmp); //требуется для того,  чтобы у PNG появился Header
if (*( Word*) C->Memory == 0xD8FF ) Image1->Picture->Graphic = ptJpg; else
if (*( LongWord*) C->Memory== 0x474E5089 ) Image1->Picture->Graphic = ptPng; else
if (*( LongWord*) C->Memory == 0x38464947 ) Image1->Picture->Graphic = ptGif; else
if (*( Word*) C->Memory== 0x4D42) Image1->Picture->Graphic = ptBmp;
Image1->Picture->Graphic->LoadFromStream( C );
delete C;
delete ptJpg;
delete ptGif;
delete ptPng;
delete ptBmp;

Сохранение изображения формата jpeg из Image в blob - поле:

#include "jpeg.hpp"

       if(Image1->Picture->Graphic != 0)
       {
       ADOTable1->Edit();
       TMemoryStream* strm3 = new TMemoryStream();
       Image1->Picture->Graphic->SaveToStream(strm3);
       ((TGraphicField*)ADOTable1->FieldByName("
Поле_БД"))->LoadFromStream(strm3);
       delete strm3;
      
ADOTable1->Post();
       }

Загрузка форматированного текста из blob - поля в RichEdit и Memo:

 if(!(TBlobField*)ADOTable1->FieldByName("Поле_БД")->IsNull){
 TMemoryStream* strm = new TMemoryStream;
 ((TGraphicField*)ADOTable1->FieldByName("
Поле_БД"))->SaveToStream(strm);
 strm->Seek(0,0);
 RichEdit1->Lines->LoadFromStream(strm);
 delete strm;
 }


Сохранение форматированного текста из RichEdit и Memo в blob - поле:

       ADOTable1->Edit();
       TMemoryStream* strm = new TMemoryStream();
       RichEdit1->Lines->SaveToStream(strm);
       ((TGraphicField*)ADOTable1->FieldByName("
Поле_БД"))->LoadFromStream(strm);
       delete strm;

Фильтрация в базе данных. Представим, что у нас есть поля Fam - фамилия, Name - имя, Year - год рождения.

ADOTable1->Filter =
"Fam=Иванов";
ADOTable1->Filtered = true;

Отмена фильтрации:

ADOTable1->Filtered = false;

Пример:

ADOTable1->Filter = "Year =
1976";
ADOTable1->Filtered = true;

Так же в запросе можно использовать AND - и, OR - или, > - больше, < - меньше.
Пример:

ADOTable1->Filter = "Year > 1976";
ADOTable1->Filtered = true;


ADOTable1->Filter = "Year > 1976 AND Name = Иван";
ADOTable1->Filtered = true;


  Поиск, первый метод:

  TLocateOptions Options;
  Options << loPartialKey << loCaseInsensitive;
  ADOTable1->Locate("Fam
", "Иванов", Options);
  DBGrid1->SetFocus();

 
По нескольким полям:

  TLocateOptions Options;
  Variant locvalues[] = {"Иванов", "Иван"};
  Options << loPartialKey << loCaseInsensitive;
  ADOTable1->Locate(
"Fam, Name", VarArrayOf(locvalues, 1), Options);
  DBGrid1->SetFocus();


  Где
loCaseInsensitive - указывает на нечувствительность регистра запроса, loPartialKey - допустимость частичного совпадения.

  Второй:

  EditName->Text = Table1->Lookup(
"Fam", "Иванов", "Name");

  Итак, я рассмотрел основные методы и сложности, которые могут возникнуть при проектировании баз данных. Успехов вам, в вашем творчестве!

Базы данных Microsoft Access в C++ Builder 6 с использованием ADO. Часть 1
Базы данных Microsoft Access в C++ Builder 6 с использованием ADO. Часть 2


Источник: изображение загрузка поток база данных Access

Всего комментариев: 2
1 nikotinishn  
Спасибо. А как можно сделать сортировку таблицы случайным образом?

2 Admin  
Создайте соответствующую тему на форуме.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Полная версия сайта