Архив рубрики «Программирование»

Динамический SQL, оператор одноэтапного исполнения

1. Причины разработки динамического SQL

Существует достаточно большой класс приложений, в которых невозможно заранее определить алгоритм доступа к БД.

Если программа только на этапе выполнения решает, какие SQL-операторы выполнять и на какие таблицы и столбцы ссылаться, то статический SQL для нее непригоден.
Прочитать остальную часть записи »

Сообщения Windows и их источники

Приложения Windows содержат различные типы объектов, которые взаимодействуют друг с другом посредством сообщений, посылаемых в ответ на события. За создание и передачу сообщений отвечает среда Windows.

Существует четыре основных источника сообщений. Приложение может получать сообщения от пользователя, от Windows, от самой себя и от других приложений.
Прочитать остальную часть записи »

Многооператорные инструкции и атомарность

Стандарт SQL-92 предусматривает возможность выполнения отдельных операторов в программе, написанной на HOST-языке.

Например, программа, вставляющая нового покупателя в таблицу и далее оформляющая на него заказ, на языке C может выглядеть как:

void main () {
exec sql insert into Customer
values (2009, ‘Hammer’, ‘New York’, 150);
/* Проверить SQLSTATE на ошибки */
exec sql insert into Orders
values (3012, 109.86, 15/12/1999, 2009, 1007);
/* Проверить SQLSTATE на ошибки */ }

Прочитать остальную часть записи »

Использование методов-сообщений для вызова корреспондирующих методов

Использование методов-сообщений
Некоторые события в классе TControl помимо корреспондирующих методов включают и объявление методов сообщений, с помощью которых осуществляется вызов корреспондирующих методов. Для этого следует объявить идентификатор пользовательского сообщения и метод сообщения в объявляемом классе. Далее следует представить реализацию метода сообщения, код которого должен включать обращение к корреспондирующему методу. Далее следует посылать сообщение любым известным способом.

Const WM_USER1=WM_APP; // Идентификатор номера сообщения Type
Type
TNumMemo=Class(TMemo)
Protected // Дополнительно объявляем метод сообщения
Procedure WMNumStr(Var Msg: TMessage); Message WM_USER1;

Прочитать остальную часть записи »

Обработка NULL-значений во встроенном SQL

1) Проблемы работы с NULL-значениями
NULL – это специальные маркеры, определенные в SQL. Попытка присвоить NULL переменным HOST-языка приведет к ошибке, поскольку они не поддерживают NULL-значений. Для устранения таких ошибок используют индикаторы переменных. Их используют не только при чтении, но и при изменении данных в таблицах БД.
Прочитать остальную часть записи »

Понятие события в Delphi — синтаксис, примеры

Наиболее общее определение события — любое происшествие, вызванное вмешательством пользователя, поведением системы или логикой кода приложения. Событие в программе может быть связано с некоторым кодом, называемым обработчиком события и отвечающим на это происшествие. С точки зрения разработчика, событие — это имя, к которому обработчик события может быть присоединен в программе.
Прочитать остальную часть записи »

Курсоры в встроенном SQL

1) Понятие курсора
В интерактивном SQL однострочные и многострочные запросы не различаются. Во встроенном SQL эти запросы выполняются по-разному. Однострочные запросы возвращают одну строку и нами уже рассмотрены. Когда результатом выполнения запроса является не одна строка, встроенный SQL должен обеспечить прикладной программе возможность построчного получения результатов запроса. Для этого используются курсоры. Под курсором понимается переменная, связанная с запросом. Ее значением является каждая строка, удовлетворяющая запросу. Как и переменные, курсоры должны быть описаны перед их использованием. В отличие от представлений курсоры предназначены для построчной обработки.
Прочитать остальную часть записи »

Свойства-массивов, переопределение свойств при наследовании

Объявления свойств-массивов

Объявление свойств-массивов имеет ряд особенностей как при их объявлении, так и при использовании. Синтаксис объявления свойства-массива класса:

Property < имя cвoucmвa>[[Const] < индекс1>:< тип идекса>
[; [Coast] < индекс2>:< тип индекса>] ]: < тип данных>
[Read < метод чтения>]
[Write < метод записи>][; Default];

Прочитать остальную часть записи »

Однострочный оператор SELECT во встроенном SQL

1) Синтаксическая форма

SELECT *|[DISTINCT|ALL] < список имен столбцов> INTO < список переменных> FROM < имена таблиц> [WHERE < предикат>]

Прочитать остальную часть записи »

Свойства классов, синтаксис объявления, типы данных свойств

Свойства классов (property) — это атрибут формы или другого компонента, который влияет либо на визуальное поведение, либо на операции, выполняемые формой или компонентами. Фактически свойство — это просто имя, связанное с полем напрямую или методами записи и/или чтения и наиболее видимая часть класса.
Прочитать остальную часть записи »

Контроль ошибок во встроенном SQL

1) Особенности контроля ошибок
Во встроенном SQL за обработку ошибок отвечает прикладная программа. Для идентификации вида ошибки используют специальные переменные. SQL-операторы могут вызывать сообщения об ошибках двух типов.

2) Ошибки компиляции и выполнения
Ошибки компиляции
Подобные ошибки обнаруживаются препроцессором, программист получает соответствующее сообщение и может устранить ошибки и заново скомпилировать прикладную программу.
Ошибки выполнения
Ссылки на несуществующие столбцы, отсутствие разрешения на обновление таблицы и т.п. могут быть обнаружены только во время выполнения.
Прочитать остальную часть записи »

Полиморфизм — реализация, параметрический полиморфизм

Полиморфизм (или много форм) — третья и самая мощная грань ООП. Полиморфизм может быть описан как поведенческая абстракция, — возможность вызывать действие или поведение по имени какого-либо конкретного экземпляра класса, не зная в точности, какая именно реализация метода при этом будет вызвана, и даже не зная в точности, к какому типу принадлежит данный объект. Тип экземпляра класса и реализация метода, который будет вызван в процессе выполнения программы, не могут быть полностью определены на фазе трансляции. Более того, процесс будет выполняться динамически — один и тот же код может работать с экземплярами разных классов.
Прочитать остальную часть записи »

Назначение встроенного SQL

Назначение встроенного SQL – комбинировать достоинства языков, давая возможность разрабатывать сложные процедурные программы, которые обращаются к БД через SQL, скрывая от пользователя сложности работы с таблицами в процедурном языке. Встраиваемые SQL-операторы могут вставляться статически или динамически. Программа со встроенным SQL представляет собой смесь SQL-операторов и кода на базовом (HOST) языке программирования, поэтому ее нельзя просто скомпилировать с помощью компилятора базового языка.
Прочитать остальную часть записи »

Структура объекта, RTTI, операторы Is и As, иерархия классов Delphi

Переменная типа класса представляет собой 4-х байтный указатель на экземпляр класса, который и является объектом. Внутренний формат данных объекта похож на запись. Каждый экземпляр класса содержит отдельную копию его полей. Поля располагаются в порядке объявления, начиная с предков. Рассмотрим внутреннюю структуру объекта, которая приведена на следующем рисунке.

Внутреннюю структуру объекта класса

Прочитать остальную часть записи »

Применений функций Net в коде Win32

Неуправляемый экспорт
Среда CLR позволяет предоставить статические методы DotNet неуправлямому коду Win32.

Для среды DotNet всякий кода Win32 называется неуправляемым, хотя неочевидно, что там будут указатели. Иногда это называют неуправляемым экспортом Unmanaged Export. Неуправляемый экспорт реализован с помощью механизма Invert Pain Work. По сути приложение Win32 способно импортировать эти функции также как и другие функции из обычных dll. Тем не менее не все языки могут это делать. В Delphi всё ограничивается экспортом глобальных функций, которые реализованы фактически как статические методы.
Прочитать остальную часть записи »

Общие правила (советы) написания запросов на SQL

Несмотря на то, что все реляционные СУБД имеют встроенный оптимизатор, существуют общие правила, которым стоит придерживаться при создании запросов:

1) Никогда не следует выполнять вычислений на индексированном столбце, например WHERE Amt*5 > : Value

2) Для отключения индекса следует использовать выражения: CName||”, CNum+0 или использовать функцию от значения столбца.
Прочитать остальную часть записи »

Абстрактные методы — объявление, наследование, полиморфизм

Абстрактными называются методы, которые определены в классе, но не содержат его реализации в этом классе. Они никогда не вызываются в объявленном классе и должны быть переопределены и реализованы в его наследниках. Абстрактными могут быть только виртуальные и динамические методы. Их основное назначение, — абстрагируясь от частностей, быть родоначальниками иерархии конкретных методов в классах наследниках. Такие методы лежат в основе принципа полиморфизма.
Прочитать остальную часть записи »

Использования объектов DotNet в коде СОМ, проблемы производительности

Если вы купили диск с DotNet:

1. Регистрация сборки DotNet
Т.е. в реестр надо добавить соответствующие сведенья. Для этого можно воспользоваться или специальным методом System.Runtime.Interop.Service.RegistrationServices. Есть специальная утилита для регистрации RegamDotNetAssembly.dll.
Прочитать остальную часть записи »

Генерация XML-документов в SQL

Для создания XML-документов, возвращаемых клиенту, в SQL Server в конце оператора SELECT предусмотрен раздел:

FOR XML {RAW|AUTO|EXPLICIT}

1) Режим RAW (без обработки)

Создается иерархический текст XML, в котором каждая строка возвращаемых данных преобразуется в одну строку с элементом <row .. />. Название поля определяет название атрибута, а значение столбца – значение атрибута. В запросе можно использовать раздел GROUP BY. Режим RAW лучше всего использовать в тех случаях, когда клиент ожидает встретить плоские документы XML и ищет элементы-строки.
Прочитать остальную часть записи »

Виртуальные и динамические методы, замещающие методы

Виртуальные методы

Адреса этих методов определяются лишь во время выполнения программы из специальной таблицы. Такой поиск называют еще поздним связыванием (late binding). Решение о вызове конкретного метода решается в процессе выполнения программы, и решение основывается на данных, хранящихся в объекте, вызывающем метод.
Прочитать остальную часть записи »

Автоматизация позднего и раннего связывания в DotNet

Автоматизация позднего связывания

Для доступа клиента к серверному объекту используется переменная типа Variant. В DotNet для этих целей используется новый тип данных и новый статический метод.

Var wType:&Type;
TW,Document,Selection:TObject;
wType:=&Type.GetTypeFromId(‘Word.Application’,True);
TW:=Activator.CreateInstance(wType);
wType.InvokeMember(‘Visible’,BindingFlagsSetProperty,Nil,Nil,True);
Document:=wType.InvokeMember

Прочитать остальную часть записи »

Работа с мультимножествами в SQL

1) Создание мультимножеств

MULTISET [< перечисление>]|MULTISET(< запрос>)|TABLE(< запрос>)

Пример:

MULTISET[14, 16, 17]
MULTISET(SELECT SNum FROM SalesPeople)

Прочитать остальную часть записи »

Наследование в ООТ — основные понятия, поведение методов при наследовании

Наследование (субклассирование) — это способность одного класса использовать характеристики другого. Оно использует отношение «вид чего-либо» между двумя классами. Этот простой принцип означает, что если вы хотите создать новый класс, лишь немного отличающийся от известного, то нет необходимости в переписывании заново полей и методов уже существующих у класса-предка.
Прочитать остальную часть записи »

Совместимость DotNet и COM

Среда DotNet обеспечивает взаимную поддержку для смешенного кода DotNet и обычного кода Win32, включая COM.

Способы обеспечения совместимости:
1. При разработки приложений Net можно использовать объекты COM за счет включения в специальную оболочку RCW (Runtime Callable Wrapper).
Прочитать остальную часть записи »

Работа с NULL-значениями в SQL

1) Подмена NULL-значений

Для замены NULL-значения на «реальное» значение предусмотрена функция COALESCE:

COALESCE (< выр1>[, < выр2>, …], < результат>)

Если < выр1> не NULL, то оно является результатом функции, иначе проверяется < выр2> и так далее. Если же все < выр1>, < выр2>, … равны NULL то возвращается < результат>.
Прочитать остальную часть записи »

Классовые процедуры и функции — синтаксис объявления и вызов

При вызове классовых процедур и функций не требуется экземпляр класса, вследствие чего невозможно и обращение к его полям. Классовые методы — это обычные подпрограммы.

Синтаксис объявления классовых методов:

Type < имя клacca>=Class[(< имя родительского класса>)]
Class Procedure < имя процедуры>[(< параметры>)};
Class Function < имя функции>[(< параметры>)]:< тип результата>
End;

Прочитать остальную часть записи »

Освобождение памяти в DotNet, Рефлексия и недостатки DotNet

Освобождение памяти

Среда CLR имеет дело с управляемыми ресурсами, а так же в ней могут использоваться и неуправляемые ресурсы. С управлением управляемым кодом среда CLR справляется сама: сама освобождает и выделяет память и т.п. с помощью сборщика мусора. (идея с WinNT сборщик мусора по времени опрашивал.) Фактически если, создан класс, то не надо его уничтожать. Когда сборщик мусора приступает к работе, он обращается к внутренним таблицам, созданным джит-компилятором. В этих таблицах хранятся ссылки на объекты, называемые корнями Roots. Они говорят о том что есть ещё объекты, на которые указывают эти ссылки и удалять их пока не надо. При этом сборщик мусора строит свою собственную структуру и контролирует корни объектов. Как только связь нарушается, т.к. нет ссылки на другой объект, «работает» сборщик мусора. Используется алгоритм поколений Generational Algorithm.
Прочитать остальную часть записи »

Организация ветвлений (case) в SQL

Для организации ветвлений в SQL-92 включен оператор CASE, который может использоваться там, где допускается ссылка на столбец. Предусмотрено две варианта его реализации.

1 Вариант

CASE {WHEN < условие> THEN < выр1>|NULL} [ELSE < выр2>|NULL]

Прочитать остальную часть записи »

Конструкторы и деструкторы в Delphi

Конструкторы и деструкторы отвечают за существование объекта в памяти, т.е. выделяют память для экземпляра класса, затем и освобождают ее.

Конструктор — это специальный вид подпрограммы, присоединенный к классу. Его на-значение — создавать представителей (экземпляры) класса. Он ведет себя как функция, которая возвращает ссылку на вновь созданный экземпляр класса, т.е. на объект. Одновременно выделяется память для хранения значений полей экземпляра класса.
Прочитать остальную часть записи »

Типы пространства имён в DotNet

Сборка может содержать любое количество типов данных. Чтобы создать приложение, которое будет работать в DotNet, нужно организовать взаимодействие между различными типами данных. Для задания определенного типа необходимо использовать уникальное имя, которое не совпадает с предоставленным пространством имён. По мути, пространство имен – это некая логическая структура, организующая имена приложений DotNet и необходимая для исключения имен(т.к. в любом языке все имена должны быть уникальными).
Прочитать остальную часть записи »




Статистика