Автор: de1phi | 18.12.2007 в 11:23 | Рубрики: ADO

Delphi поддерживает статический и динамический SQL. В Delphi имеется объект TQuery, который используется для хранения и выполнения SQL-запросов.

Свойство TQuery SQL содержит текст SQL-запроса, выполняемых TQuery.
Данное свойство имеет тип TStrings, означающее, что оно может хранить в списке целую серию строк. Список ведет себя подобно массиву, но в действительности это специальный класс с уникальными возможностями.

Компонент TQuery позволяет выполнять два типа SQL-запросов:

Статические SQL-запросы
Динамические SQL-запросы
Статический SQL-запрос устанавливается во время проектирования и не содержит никаких параметров или переменных. Например, следующая строка является статическим SQL-запросом:
SELECT * FROM CUSTOMER WHERE CUST_NO = 1234
Читать полностью…

Проблема обнаружена под операционной системой Windows 2000 SP3, в среде Delphi6, Delphi7 (скорее всего не зависит от версии Delphi) с использованием Microsoft Jet DB Engine версия 4, SP3.

Некоторый, вполне типичный, код заполнения запроса в процессе выполнения вызывает Access Violation, притом, что согласно документации все должно работать корректно.

Пример кода:

Допустим, есть база данных в MS Access 2000, имеющая таблицу main и в ней целочисленное (INT) поле id в качестве главного ключа. Так же есть компонент ADOQuery1: TADOQuery, для доступа к базе данных. Максимальное значение поля id может быть получено следующим кодом:
Читать полностью…

//How to retrieve all database tables with ADO

unit dbTables;

interface

uses ADODb;

type
TTableType = (ttTable, ttView, ttSynonym, ttSystemTable, ttAccessTable);
Читать полностью…

Автор: de1phi | в 10:22 | Рубрики: ADO

В оконных приложениях инициализацию COM берет на себя строка в файле проекта:

Application.Initialize;

А вот в DLL и консольных программах обэекта Application нет, и при попытке работать с любыми ActiveX, включая широко используемые ADO компоненты генерится ошибка, которую исправить очень просто: достаточно в секцию Uses в DPR файле добавить модуль oleauto

Автор: de1phi | в 10:22 | Рубрики: ADO

Итак, хочу поделиться некоторыми достижениями… так на всякий случай. Если у вас вдруг потребуется сделать в своей программке доступ к базе данных, а BDE использовать будет неохота (или невозможно) - то есть довольно приятный вариант: использовать ActiveX Data Objects. Однако с их использованием есть некоторые проблемы, и одна из них это как передавать Optional параметры, которые вроде как можно не указывать. Однако, если вы работаете с ADO по-человечески, а не через тормозной IDispatch.Invoke то это превращается в головную боль. Вот как от нее избавляться:
Читать полностью…

Автор: de1phi | в 10:22 | Рубрики: ADO

CONECT_STR=’Provider=Microsoft.Jet.OLEDB.4.0;Password=” ” ;User ID=Admin;’+{Data Source=D:\ExBd\ТЕРМО\Bd0.mdb;}
‘Data Source=%s; Mode=Read|Write|Share Deny None;Extended Properties=” ” ;’+
‘Locale Identifier=1049;Persist Security Info=True;Jet OLEDB:System database=” ” ;’+
‘Jet OLEDB:Registry Path=” ” ;Jet OLEDB:Database Password=” ” ;Jet OLEDB:Engine Type=4;’+
‘Jet OLEDB:Database Locking Mode=0;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:Compact Without Replica Repair=False;Jet OLEDB:SFP=False’;

function TdmR3.GetCountForPeriod(LastDate: TDateTime; IsPlan: boolean): Integer;
var qu: TADOQuery;
S: String;
begin
qu:=TADOQuery.Create(nil);
try
S:=FormatDateTime(’dd.mm.yy’,LastDate);
qu.ConnectionString:=WideString(Format(CONECT_STR,[db_file]));
qu.SQL.Text:=’select count(*) from DecadaVal as d where d.LastDate=:LastDate and IsPlan=:IsPlan’;
qu.Parameters[0].Value:=LastDate;
qu.Parameters[1].Value:=IsPlan;
qu.Open;
Result:=qu.Fields[0].AsInteger;
finally
qu.Free;
end;
end;

Автор: de1phi | в 10:22 | Рубрики: ADO

unit ADO;
{This unit provides a quick access into ADO
It handles all it’s own exceptions
It assumes it is working with SQL Server, on a PLC Database
If an exception is thrown with a [PLCErr] suffix:
the suffix is removed, and ErrMsg is set to the remaining string
otherwise
the whole exception is reported in ErrMsg
Either way, the function call fails.
Читать полностью…

procedure TForm1.Button1Click(Sender: TObject);
var
SL: TStrings;
index: Integer;
begin
SL := TStringList.Create;
try
ADOConnection1.GetTableNames(SL, False);
for index := 0 to (SL.Count - 1) do begin
Table1.Insert;
Table1.FieldByName(’Name’).AsString := SL[index];
ADOTable1.TableName := SL[index];
ADOTable1.Open;
Table1.FieldByName(’Records’).AsInteger :=
ADOTable1.RecordCount;
Table1.Post;
end;
finally
SL.Free;
ADOTable1.Close;
end;
end;

Автор: de1phi | в 10:22 | Рубрики: ADO

{
Exporting ADO tables into various formats

In this article I want to present a component I built in order to
supply exporting features to the ADOTable component. ADO supplies
an extended SQL syntax that allows exporting of data into various
formats. I took into consideration the following formats:

1)Excel
2)Html
3)Paradox
4)Dbase
5)Text

You can see all supported output formats in the registry:
“HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\ISAM formats”

This is the complete source of my component }
Читать полностью…

Данная статья не является каким-либо учебным пособием, а просто попыткой обобщить некий опыт, полученный в течение некоторого времени при использовании ADO.

Подвигло меня на написание этой статьи то обстоятельство, что когда я приступал к этой работе (я имею в виду использование ADO), я размещал свои вопросы во многих конференциях, а ответов на них не получено до сих пор и, более того, эти же вопросы стали задаваться по новой, а ответов на них как не было, так и нет. На некоторые из них я отвечал, а потом подумал, что не все будут просматривать конференцию целиком, да и когда все сведено в одном месте оно и лучше. Кроме того, толковой литературы по использованию ADO практически нет никакой. Например, мне не удалось найти в солидных по объему книгах г-на Архангельского необходимую мне информацию. Или еще пример - Microsoft Press ‘Справочник по OLE DB’. Здесь другой уклон - информации много, слишком много, а примеров никаких (но это вообще проблема справок от Microsoft - написано много, а примеров использования почти нет).
Читать полностью…

Автор: de1phi | в 10:22 | Рубрики: ADO

function GetADOVersion: Double;
var
ADO: OLEVariant;
begin
try
ADO := CreateOLEObject(’adodb.connection’);
Result := StrToFloat(ADO.Version);
ADO := Null;
except
Result := 0.0;
end;
end;

// To use this function try something like:
procedure TForm1.Button1Click(Sender: TObject);
const
ADOVersionNeeded = 2.5;
begin
if GetADOVersion then
ShowMessage(’Need to install MDAC version 2.7′)
else
ShowMessage(Format(’ADO Version %n, is OK’, [GetADOVersion]));
end;

Автор: de1phi | в 10:22 | Рубрики: ADO

Программы пропили всё… Даже курсор от мышки…

В Delphi компоненты ADOExpress довольно приятны в использовании. Однако программирование компонент ADOExpress весьма отличается от традиционного Delphi программирования в компонентах TTable и TQuery, основанных на BDE. Естевственно, что если Вы привыкли к компонентам BDE dataset, то сразу же заметите различие в количестве возможностей и свойств, а так же в стиле программирования BDE и ADO.
Читать полностью…

Автор: de1phi | в 10:22 | Рубрики: ADO

ADOQuery1.Edit;
TBLOBField(ADOQuery1.FieldByName(’myField’)).LoadFromFile(’c:\my.bmp’);
ADOQuery1.Post;

Автор: de1phi | в 10:22 | Рубрики: ADO

uses
ComObj;

function OpenConnection(ConnectionString: AnsiString): Integer;
var
ADODBConnection: OleVariant;
begin
ADODBConnection := CreateOleObject(’ADODB.Connection’);
ADODBConnection.CursorLocation := 3; // User client
ADODBConnection.ConnectionString := ConnectionString;
Result := 0;
try
ADODBConnection.Open;
except
Result := -1;
end;
end;

function DataBaseConnection_Test(bMessage: Boolean): AnsiString;
var
asTimeout, asUserName, asPassword, asDataSource, ConnectionString: AnsiString;
iReturn: Integer;
OldCursor: TCursor;
begin
OldCursor := Screen.Cursor;
Screen.Cursor := crHourGlass;
asTimeout := ‘150′;
asUserName := ‘NT_Server’;
asPassword := ‘SA’;
asDataSource := ‘SQL Server - My DataBase’;

ConnectionString := ‘Data Source = ‘ + asDataSource +
‘User ID = ‘ + asUserName +
‘Password = ‘ + asPassword +
‘Mode = Read|Write;Connect Timeout = ‘ + asTimeout;
try
iReturn := OpenConnection(ConnectionString);

if (bMessage) then
begin
if (iReturn = 0) then
Application.MessageBox(’Connection OK!’, ‘Information’, MB_OK)
else if (iReturn = -1) then
Application.MessageBox(’Connection Error!’, ‘Error’, MB_ICONERROR +
MB_OK);
end;

if (iReturn = 0) then
Result := ConnectionString
else if (iReturn = -1) then
Result := ”;
finally
Screen.Cursor := OldCursor;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
DataBaseConnection_Test(True);
end;

Автор: de1phi | в 10:22 | Рубрики: ADO

В данной статье мы обратим внимание на компонент TADOCommand и использование языка SQL DDL (Data Definition Language), с целью помочь Вам с проблемой переноса данных BDE/Paradox в ADO/Access.

Язык определения данных (Data Definition Language)

Не многие программисты создают базу данных программным путём, большинство из нас для этого используют некую визуальную среду наподобие MS Access для построения файла MDB. Но иногда нам всё таки приходится создавать и удалять базу данных, а так же объекты базы данных программным путём. Для этого используется наиболее распространённая на сегодняшний день технология Structured Query Language Data Definition Language (SQL DDL). Выраджения языка определения данных (DDL) - это SQL выражения, которые поддерживают определения или объявления объектов базы данных (например, CREATE TABLE, DROP TABLE, CREATE INDEX либо подобные им).

В рамки данной статьи не входит детальное ознакомление с языком DDL. Если Вы знакомы с языком SQL DML (Data Manipulation Language - это выражения типа SELECT, UPDATE и DELETE), то DDL не будет для Вас серьёзным барьером. Обратите внимание, что работа с DDL может быть весьма ухищрённой, так как каждый производитель базы данных може включать в неё собственные расширения для SQL.

Давайте взглянем на простейший пример выражения CREATE TABLE:

CREATE TABLE PhoneBook(
Name TEXT(50)
Tel TEXT(50));

Данное DDL выражение (для MS Access) в время выполнения создаст новую таблицу с названием PhoneBook. Таблица PhoneBook будет иметь два поля: Name и Tel. Оба поля имеют строковый тип (TEXT) и размер поля 50 символов.

TFieldDef.DataType

Очевидно, что в Access тип данных, представленный строкой это TEXT. В Paradox это STRING. Чтобы передать таблицы Paradox в Access, нам необходимо знать какие типы данных присутствуют и, соответственно их имена. При работе в BDE с таблицами Paradox, TFieldDef.DataType определяет тип физического поля в (dataset) таблице. Поэтому для успешного перенесения данных из таблиц Paradox в Access Вам необходимо создать функцию, которая бы преобразовывала соотвествующие типы полей Paradox в типы Access.

Давайте посмотрим на пример функции, которая проверяет тип поля (fd) и возвращает соответствующий тип Access, а заоодно и размер поля, который необходим для выражения CREATE TABLE DDL.

function AccessType(fd:TFieldDef):string;
begin
case fd.DataType of
ftString: Result:=’TEXT(’+IntToStr(fd.Size)+’)';
ftSmallint: Result:=’SMALLINT’;
ftInteger: Result:=’INTEGER’;
ftWord: Result:=’WORD’;
ftBoolean: Result:=’YESNO’;
ftFloat : Result:=’FLOAT’;

else
Result:=’TEXT(50)’;
end;
end;

ADOX

ADOX - это расширения ADO для Data Definition Language а так же для модели защиты (ADOX). ADOX предоставляет разработчикам богатый набор инструментов для получения доступа к структуре, модели защиты, а так же процедурам, хранимым в базе данных.

Для использования ADOX в Delphi, Вам необходимы установить библиотеку типа ADOX.

Select Project | Import Type Library
Выберите “Microsoft ADO Ext 2.x for DDL and Security (Version 2.x)”
Измените “TTable” на “TADOXTable”
Измените “TColumn” на “TADOXColumn”
Измените “TIndex” на “TADOXIndex”
Нажмите кнопку Install (перекомпиляция пакетов (packages))
Нажмите один раз OK и дважды Yes
File | Close All | Yes
На вершине объектной модели ADOX находится объект Catalog. Он обеспечивает доступ к набору Таблиц (Tables), Видов (Views) и Процедур, который используется для работы со структурой базы данных, а так же к набору Пользователей (Users) и рупп (Groups), которые используются для авторизации доступа. Каждый объект Catalog связан только с одним подключением к источнику данных.

Давайте оставим ADOX (пока) и перейдём к ADOExpress.

TADOCommand

В ADOExpress компонент TADOCommand - это VCL представление объекта ADO Command. Объект Command представляет команду (запрос или выражение), которая может быть обработана источником данных. Команды могут быть выполнены методом Execute, используемым в ADOCommand. TADOCommand чаще всего используется для исполнения команд языка определения данных (DDL) SQL. Свойство CommandText содержит в себе саму команду. Свойство CommandType используется для того, как интерпретировать свойство CommandText. Тип cmdText используется для указания инструкции DDL. Впринципе, использовать компонент ADOCommand для получения данных из таблицы, запросов или хранимых процедур не имеет смысла, но никто не запрещает Вам пользоваться данным компонентов и в таких целях.

Итак, самое время приступить к реальному программированию…

Приведённый ниже проект демонстрирует следующее:

Получение списка всех таблиц из BDE, использование TFieldDefs чтобы получить определения (имя, тип данных, размер, и т.д.) полей в таблице, создание инструкции CREATE TABLE и копирование данных из таблицы BDE/Paradox в таблицу ADO/Access.

Давайте решим эту задачу по шагам:

GUI

Запускаем Delphi - получаем новый проект с пустой формой. Добавляем две кнопки, один ComboBox и один компонент Memo. Далее добавляем компоненты TTable, TADOTable, TADOConnection и TADOCommand. Чтобы установить следующие свойства, используем Object Inspector (оставьте все другие свойства как есть - например, Memo будет иметь имя по умолчанию: Memo1):

Button1.Caption = ‘Construct Create command’
Button2.Caption = ‘Create Table and copy data’
ComboBox.name = cboBDETblNames;

ADOConnection1.ConnectionString = …
TADOTable.name = ADOTable
ADOTable.Connection = ADOConnection1
TADOCommand.name = ADOCommand
ADOCommand.Connection = ADOConnection1
TTable.name = BDETable
BDETable.DatabaseName = ‘DBDEMOS’

Пример:

Для получения списка таблиц, связанных с данной базо данных (DBDEMOS) мы воспользуемся следующим кодом (OnCreate для формы):

procedure TForm1.FormCreate(Sender: TObject);
begin
Session.GetTableNames(’DBDEMOS’, ‘*.db’, False,
False, cboBDETblNames.Items);
end;

В самом начале ComboBox содержит имена таблиц (Paradox) в базе данных DBDEMOS. В нижеприведённом коде мы выберем таблицу Country.

Следующая наша задача - это создание инструкции CREATE TABLE DDL. Это делается в процедуре OnClick кнопки ‘Construct Create command’:

//Кнопка ‘Construct Create command’
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
s: string;
begin
BDETable.TableName:=cboBDETblNames.Text;
BDETable.FieldDefs.Update;

s:=’CREATE TABLE ‘ + BDETable.TableName + ‘ (’;
with BDETable.FieldDefs do
begin
for i:=0 to Count-1 do
begin
s:=s + ‘ ‘ + Items[i].name;
s:=s + ‘ ‘ + AccessType(Items[i]);
s:=s + ‘,’;
end;
s[Length(s)]:=’)';
end;

Memo1.Clear;
Memo1.lines.Add (s);
end;

Вышеприведённый код просто анализирует определения полей для выбранной таблицы (cboBDETblNames) и генерирует строку, которая будет использоваться свойством CommandText компоненты TADOCommand.

Например, когда Вы выбираете таблицу Country, то Memo будет заполнен следующей строкой:

CREATE TABLE country(
Name TEXT(24),
Capital TEXT(24),
Continent TEXT(24),
Area FLOAT,
Population FLOAT)

И в заключении, пример для кнопки ‘Create Table and copy data’ , которая удаляет таблицу (DROP..EXECUTE), создаёт таблицу (CREATE..EXECUTE), и затем копирует данные в новую таблицу (INSERT…POST). Так же присутствует некоторая обработка ошибок, но код будет выходить на ошибку, если, например, (новая) таблица ещё не существует (в случае удаления).

//Кнопка ‘Create Table and copy data’
procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
tblName: string;
begin
tblName:=cboBDETblNames.Text;

//обновляем
Button1Click(Sender);

//удаление & создание таблицы
ADOCommand.CommandText:=’DROP TABLE ‘ + tblName;
ADOCommand.Execute;

ADOCommand.CommandText:=Memo1.Text;
ADOCommand.Execute;

ADOTable.TableName:=tblName;

//копируем данные
BDETable.Open;
ADOTable.Open;
try
while not BDETable.Eof do
begin
ADOTable.Insert;
for i:=0 to BDETable.Fields.Count-1 do
begin
ADOTable.FieldByName
(BDETable.FieldDefs[i].name).Value :=
BDETable.Fields[i].Value;
end;
ADOTable.Post;
BDETable.Next
end;
finally
BDETable.Close;
ADOTable.Close;
end;
end;

Вот и всё. Теперь проверьте Вашу базу данных Access…вуаля :) теперь в ней находится таблица Country со всеми данными из DBDEMOS.

Однако некоторые вопросы остались без ответа, например: как добавлять индексы в таблицу (CREATE INDEX ON …), или как создавать пустую базу данных Access.

Автор: de1phi | в 10:22 | Рубрики: ADO

Самая распространённая задача, которую решают приложения работающие с базами данных - это поиск необходимых записей по заданному критерию. В Delphi, компоненты ADOExpress включают в себя методы поиска записей, аналогичные тем, которые используются в BDE.

В данной статье будут рассмотрены различные способы поиска данных разработке ADO-приложений в Delphi

Обычно алгоритм поиска строится по следующей схеме: начинаем поиск с начала таблицы, проверяем поле в каждой строке на предмет удовлетворения нашему критерию, останавливаем цикл на выбранной записи.

Давайте рассмотрим несколько способов расположения данных, полученных из БД посредствам компонента ADODataset (для Таблицы и для Запроса).
Читать полностью…

Автор: de1phi | в 10:22 | Рубрики: ADO

Здесь представлены работающие компоненты обновления данных, полученных запросом через TADOQuery, аналогичные компонентам BDE TQuery,TUpdateSQL

Компоненты TADOUpdateQuery, TADOUpdateSQL выполняют в точности те же функции что и компоненты BDE TQuery,TUpdateSQL.
Это может способствовать быстрому переводу программ с BDE на ADO. Компоненты работающие (в исходных текстах есть комментарии), но до полной совместимости необходимы доработки, например: отсутствуют события onUpdateRecord, onUpdateError.
Предлагаю всем подключится и довести дело до конца.
Читать полностью…

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Модуль, содержащий несколько удобств для работы с MSSQL посредством ADO

Зависимости: Windows, Classes, SysUtils, ADODB, ADOInt, ActiveX, Controls, Variants, ComObj
Автор: Delirium, Master_BRAIN@beep.ru, ICQ:118395746, Москва
Copyright: Delirium
Дата: 30 апреля 2002 г.
***************************************************** }
Читать полностью…

Автор: delphi | в 8:20 | Рубрики: ADO, Базы данных

По традиции, приложения Delphi использовали технологию BDE для доступа к данным. Но с появлением Delhi 5 появилась новая возможность - ADO.

С момента появления Delphi 5, который включает технологию ADOExpress ( она входит в Delphi Enterprise или продается как отдельная опция к Delphi Professional), программисты встретились с выбором: что использовать BDE или ADO для доступа к БД ? Типичным ответом на вопрос “Какую технологию Баз Данных использовать ?” будет - “Это зависит от …”
Читать полностью…