Два программиста:
- Ко мне вчера чувак приходил, сервак сломал.
- Он что хакер?
- Нет, мудак!

function CheckMSSQLServer(fServerName, fUserName, fPsw : string) : Bool;
var
wDb : TDatabase;
begin
// Check if MS SQL Server is reachable
// Важно! BDE Должна быть установлена
Result := False;
wDb := TDatabase.Create(nil);

with wDb do
begin
DatabaseName := ‘wDbDatabaseName’; // arbitrary name, must be unique
// in current Session
Params.Values[’SERVER Name’] := fServerName;
Params.Values[’USER Name’] := fUserName;
Params.Values[’PASSWORD’] := fPsw;
LoginPrompt := False;
end;

try
wDb.DriverName := ‘MSSQL’;
try
wDb.Connected := True;
wDb.Connected := False;
except
ShowMessage(’Server is not reachable’);
end;
Result := True;
finally
wDb.Free;
end;
end;

Автор: admin | в 4:16 | Рубрики: Базы данных

Как мне передать значение переменной в SQL-запросе? К примеру, в обработчике onClick клавиши вывести все записи с величиной поля большей, чем задал пользователь. Можно ли в Delphi создать что-либо подобное механизму запросов, реализованному в Paradox for Windows?

Решение этой задачи в Delphi подобно созданию и выполнению строки запроса SQL в Paradox.

Pdoxwin код:

method pushButton(var eventInfo Event)
var
s string
q query
d database
endvar

d.open( “MYALIAS” )
s = “select * from mytable where somefield=\”" + entryField.value + “\”"
q.readFromString( s )
q.executeSQL( d )

endmethod

Delphi код:

procedure TForm1.Button1Click(Sender: TObject);
begin
MyQuery.Active := false;
MyQuery.SQL.clear;
MyQuery.SQL.add(’select * from mytable where somefield=”‘ +
EntryField.Text + ‘”‘);
MyQuery.Active := true;
end;

Автор: admin | 18.12.2007 в 11:23 | Рубрики: Базы данных

По умолчанию, оператор UPDATE в MS SQL Server пытается поставить эксклюзивную табличную блокировку. Вы можете обойти это, используя ключевое слово FROM в сочетании с опцией PAGLOCK для использования MS SQL Server страничных блокировок вместо эксклюзивной табличной блокировки:

UPDATE orders SET customer_id=NULL FROM orders(PAGLOCK) WHERE customer_id=32;
Блокиpовка на всю таблицу пpи UPDATE ставится только в том случае, если по пpедикату нет индекса. Так, можно пpосто пpоиндексиpовать таблицу orders по полю customer_id, и не забывать делать UPDATE STATISTIC, хотя будет работать и с PAGLOCK. Просто не факт, что UPDATE всегда делает табличную блокировку.

Автор: admin | в 11:23 | Рубрики: Базы данных

SUBSTRING(’Delphi World - это супер!!!’ from 1 to 6)

SQL-функция SUBSTRING может использоваться в приложениях Delphi, работающих с запросами к локальной SQL, но она не поддерживается при работе с таблицами InterBase (IB) и Local InterBase Server (LIBS). Ниже приведен синтаксис функции SUBSTRING, примеры ее использования в запросах к local SQL, и альтернатива для возвращения тех же результатов для таблиц IB/LIBS.

Синтаксис функции SUBSTRING:

SUBSTRING( FROM [, FOR ])
Где:
- имя колонки таблицы, из которой должна быть получена подстрока (substring).

место в значении колонки, начиная с которого извлекается подстрока.

длина извлекаемой подстроки.

Функция SUBSTRING в примере ниже возвратит второй, третий и четвертый символы из колонки с именем COMPANY:
Читать полностью…

Антивирус. Ты кто?
Вирус. Область данных!
Антивирус. А не вирус?
Вирус. Hи боже мой!
Антивирус. А зачем прерывания перехватываешь?
Вирус. Я?!
Антивирус. Вот же подпрограмма.
Вирус. Это не подпрограмма. Это цитата из Лао-цзы на языке оригинала в альтернативной кодировке.
Антивирус. А зачем EXE-файлы ищешь?
Вирус. А вдруг хозяин спросит: “А где мои ЕХЕ-файлы?” А я ему - вот они!
Антивирус. Сдается мне, что ты все-таки вирус.
Вирус. Hу ладно, только тебе признаюсь, только ты никому не говори! Hа самом деле я… антивирусная вакцина!
Антивирус. А зачем нужна антивирусная вакцина, если есть я?
Вирус. Откуда я знаю? У хозяина спроси.
Антивирус. А если я тебя на всякий случай все-таки грохну?
Вирус. А если я тебя?
Антивирус. Hе получится. У меня управление.
Вирус. А ты свою контрольную сумму давно пересчитывал?
Антивирус. А причем тут моя контрольная… ой!!!
Вирус. То-то же.

Бывают случаи, когда в приложении Delphi, которое для получения доступа к данным использует SQL, необходимо узнать сумму вычисленных данных. Другими словами, необходимо с помощью SQL создать вычисляемое поле и применить к нему функцию SUM.

При выполнении такой операции с SQL-таблицами (например, Local InterBase Server), все достаточно тривиально, и сумма вычисляется простым использованием функции SUM с указанием поля. Например, используя демонстрационную таблицу EMPLOYEE (из базы данных EMPLOYEE.GDB):

SELECT SUM(SALARY / 12)
FROM EMPLOYEE
Та же самая методика применима в случае возвращаемого набора данных, в котором значения группируются в другом столбце с помощью утверждения GROUP BY:
SELECT EMP_NO, SUM(SALARY / 12)
FROM EMPLOYEE
GROUP BY EMP_NO
ORDER BY EMP_NO
Пока SQL базы данных поддерживают суммирование вычисляемых полей, локальный SQL этого делать не будет. Для получения результатов нужны другие методы, например копирование результатов запроса с вычисляемым полем во временную таблицу (как и в случае компонента TBatchMove), и использование компонента TQuery для вычисления суммы данных во временной таблице.

Автор: admin | в 11:23 | Рубрики: Базы данных

Примечание: Данный документ представляет собой коллективный труд нескольких авторов, которые индивидуально несут ответственность за качество предоставленной здесь информации. Borland не предоставлял, и не может предоставить никакой гарантии относительно содержимого данного документа.

Введение
Компонент TQuery
Свойство SQL
Свойство Params
Источник данных
Команда Format
Open против ExecSQL
Компонент TStoredProc
TDatabase
Выводы
Читать полностью…

В процессе работы с БД иногда необходимо выполнить какие-то мелкие запросы. Держать для этого где-то временную Query меня лично ломает, посему ловите творение (под Delphi) - модуль для создания временных TQuery и работы с ними.

примеры использования:

var
S: string;

S := FastLookUp(format(’select A.F1 from A,B where A.F4=B.F4 and
B.F9=%d’, [1]));

with GiveMeResultSet(’select*from A where F1=”777″‘) do
try
….
finally
Free; {не забудьте!}
end;
…..
Читать полностью…

Автор: admin | в 11:23 | Рубрики: Базы данных

Приходит один программист к другому:
- Слышь, Петя, мне генератор случайных чисел нужен.
- Четырнадцать!

Вам ещё не надоело динамически генерировать SQL запросы insert и update ? Давайте посмотрим, как можно раз и навсегда упростить этот процесс.

Допустим Вы создавали запрос следующим образом (типы параметров Data1:string Data2: integer Data3:TdateTime)

Читать полностью…

Библиотека для организации поисковой системы в произвольной БД с помощью динамических SQL запросов.

Описание:

Результатом работы функции:

Search_out(_путь : string): TConrolSearch;

является создание файла с формированным SQL запросом, который в последствии используется компонентов TQuery.

Функция возвращает значение - код ошибки при формировании запроса. Если 0, то запрос сформирован удачно, в противном случае формируется код ошибки (например 1, если послан нулевой запрос). Ошибки младших байтов от 0..4 не являются критическими в плане неправильного формирования запроса. Старшие байты от 5..8 вызывают критические ошибки (TSQL не может выполнить запрос).

Перед вызовом функции, необходимо задать параметры объекта для формирования файла sql запроса.
Читать полностью…

Автор: admin | в 11:23 | Рубрики: Базы данных

Вывод нужных полей

SELECT LastName, FirstName, Salary FROM employee

[Хотим вывести только имя, фамилию и оклад служащих]

Вывод всех полей из таблицы

SELECT * FROM employee

[ * обозначает все поля]

Задание псевдонима таблице

SELECT * FROM employee emp

where emp.salary>35000

[Таблице employee в качестве псевдонима задано emp

Выводим всех служащих с окладом свыше 35000]
Читать полностью…

Автор: admin | в 11:23 | Рубрики: Базы данных

Local SQL не поддерживает вложенные запросы, но после того как я заработал клок седых волос, я нашел в высшей степени простое решение: использование временной таблицы.

Пример:

with GeneralQuery do
begin
SQL.Clear;
SQL.Add(…. внутренний SQL);
SQL.Open;
DbiMakePermanent(handle, ‘temp.db’,true);
SQL.Clear;
SQL.Add(SELECT … FROM ‘temp.db’….);
SQL.Open;
end;

Единственное: необходимо убедиться в том, что имя таблицы не вступает в конфликт с именами нескольких работающих копий таблицы. И, разумеется, данная технология не даст “живой” набор!

Автор: admin | в 11:23 | Рубрики: Базы данных

Как с помощью SQL найти записи таблицы, которых нет в другой таблице?

Вот пример:

with PeopleHiddenForm.PersonQuery.SQL do begin
Add(’Select P.Last, P.First, P.Middle, P.”Suffix”, P.KeyNo, COUNT(PersMemL.PersonKeyNo)’);
Add(’From Person P Left Outer Join ‘);
Add(’ PersMemL PersMemL’);
Add(’On ((P.KeyNo = PersMemL.PersonKeyNo))’);
Add(’Group By P.Last, P.First, P.Middle, P.Suffix, P.KeyNo’);
Add(’Having ((Count(PersmemL.PersonKeyNo) = 0))’);

Данный код позволяет связаться с таблицей (PersMemL), содержащей количество ключей персональной записи и запись членства. Запрос возвращает имена персон, которые не имеют записей членства.

На практике этот способ оказывается очень эффективным, по крайней мере, с локальным SQL в таблицах Paradox.

Автор: admin | в 11:23 | Рубрики: Базы данных

Я заполнил таблицу 10 записями и сделал SQL с “OR” (в свойстве “select * from”, где acreage=5.5 или acreage=6). Это работает. Затем я возвратился и поместил вторичный индекс в поле acreage - и это НЕ СРАБОТАЛО.

Наличие вторичного индекса не позволяет нормально отработать запросу SQL.

В дополнение к высказываниям “настоящие” программисты считают, что в 1 км - 1024 м, в сутках 3 байта…

SELECT CAST((поле_с_датой -”NOW”) AS INTEGER) FROM MyBase
Получишь результат в днях.

Автор: admin | в 11:23 | Рубрики: Базы данных

Как мне передать переменную в запрос?

Сначала вы должны создать запрос, использующий переменную.

Select Test.”FName”, Test.”Salary Of Employee”
From Test
Where Test.”Salary of Employee” > :val
Примечание: Если вы просто пишете имя поля как “Salary of Employee”, вы получите ошибку “Capability Not Supported”. Это должно быть просто Test.”Salary of Employee”.
В нашем случае имя переменной “val”, но это может быть любое другое (естественно). Затем вы переходите к свойству TQuery’s params и устанавливаете параметр “val” в зависимости от требуемого типа. В нашем примере мы используем тип integer.
Читать полностью…

Почему мышиный курсор не возвращается обратно (не становится обычной стрелкой) после выполнения запроса?

При выполнении открытого запроса, Delphi изменяет для вас курсор, и произойти это может даже в середине события, как, например, при нажатии на кнопку. Приведенный ниже пример отобразит курсор в виде иконки песочных часов (SQL Hourglass Icon) после того, как вы закроете окно с сообщением. При этом мышь будет вести себя так, как будто находится в режиме “стрелки”.

// Добавьте к обработчику события нажатия кнопки,
// использование запроса при этом не имеет значения
// Select * from Customer (в IBLocal)

with query1 do
begin
close;
open;
showmessage(IntToStr(RecordCount));
end; // with

При наступлении события, Delphi пробует обратно придать курсору тип стрелки (Arrow), при этом выводится новая форма (диалог showmessage), которая мешает автоматическому переводу курсора в режим стрелки.

Для решения этой проблемы нужно добавить Application.ProcessMessages прежде, чем форма будет показана, это позволит обработать все сообщения, скопившиеся в очереди (и очистить ее), после чего мышиный курсор вновь пример нормальную форму.

// Добавьте к обработчику события нажатия кнопки,
// использование запроса при этом не имеет значения
// Select * from Customer (в IBLocal)

with query1 do
begin
close;
open;
application.ProcessMessages; // Добавьте эту строку.
showmessage(IntToStr(RecordCount));
end; // with

Постовой:
Женский журнал “Мой стиль” - свежая информация из мира моды и дизайна.

Содержание

Обзор
Создание таблиц с помощью SQL
Заключение
Обзор

На данном уроке мы познакомимся еще с одной возможностью создания таблиц - через посылку SQL-запросов. Как Вы, наверное, могли заметить на предыдущем уроке, Database Desktop не обладает всеми возможностями по управлению SQL-серверными базами данных. Поэтому с помощью Database Desktop удобно создавать или локальные базы данных или только простейшие SQL-серверные базы данных, состоящие из небольшого числа таблиц, не очень сильно связанных друг с другом. Если же Вам необходимо создать базу данных, состоящую из большого числа таблиц, имеющих сложные взаимосвязи, можно воспользоваться языком SQL (вообще говоря, для этих целей лучше всего использовать специализированные CASE-средства, которые позволяют в интерактивном режиме сгенерировать всю структуру базы данных и сформировать все связи; описание двух наиболее удачных CASE-средств - System Architect и S-Designor - дано в дополнительных уроках). При этом можно воспользоваться компонентом Query в Delphi, каждый раз посылая по одному SQL-запросу, а можно записать всю последовательность SQL-предложений в один так называемый скрипт и послать его на выполнение, используя, например, Windows Interactive SQL (WISQL.EXE) - интерактивное средство посылки SQL-запросов к InterBase (в том числе и локальному InterBase), входящее в поставку Delphi. Конечно, для этого нужно хорошо знать язык SQL, но, уверяю Вас, сложного в этом ничего нет! Конкретные реализации языка SQL незначительно отличаются в различных SQL-серверах, однако базовые предложения остаются одинаковыми для всех реализаций. Практика показывает, что если нет необходимости создавать таблицы во время выполнения программы, то лучше воспользоваться WISQL.
Читать полностью…

Автор: admin | в 11:23 | Рубрики: Базы данных

Кто-нибудь знает как “вытащить” месяц или год из datetime-поля с помощью SQL? Я знаю, что QBE этого не может. SQL в состоянии это сделать?

Как насчет функции EXTRACT?

SELECT SALEDATE,
EXTRACT(DAY FROM SALEDATE) AS DD,
EXTRACT(MONTH FROM SALEDATE) AS MM,
EXTRACT(YEAR FROM SALEDATE) AS YY
FROM ORDERS

Автор: | в 11:23 | Рубрики: Базы данных

Я использую поле Tmemo.

Это классно работает до тех пор, пока я не использую расширенные символы (с кодом больше 127). При использовании этих символов текст-то я послать могу, но при последующем поиске записи я получаю такое сообщение об ошибке:

“General SQL error : Cannot transliterate character between character sets.” (Общая ошибка SQL: не могу сопоставить символ с имеющимися наборами символов).

Я понял, в чем ваша ошибка: вы должны установить встроенный набор символов LIBS в DEFAULT CHARACTER SET ISO8859_1. Когда вы впоследствии создадите таблицу, она будет использовать данный набор символов для создания alfanumeric-данных и Blob-полей. Псевдоним базы данных должен быть установлен на драйвер языка BLLT1FR.

После того, как я сделал это и пересоздал базу данных, все заработало как надо.

Может быть и не стоило публиковать эту информацию, поскольку многие пользователи пользуются локальными драйверами, наборами символов и новой версией SQL, но я посчитал ее ценной, поскольку как раз эта инфорамция в описании и отсутствует. Она присутствует только в LIBS “readme”-файле.

Автор: de1phi | в 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
Читать полностью…

Автор: de1phi | в 11:23 | Рубрики: Базы данных

SQL-менеджер Хортица

Менеджер предназначен для управления данными при помощи SQL-запросов и операторов с упрощенным синтаксисом. С его помощью Вы сможете делать выборки из одной или нескольких таблиц, записывать результаты в новые таблицы или добавлять в существующие, легко и быстро создавать из выборки простые табличные отчеты, отчеты в виде «шахматок», сложные отчеты на основе результатов нескольких SQL-запросов и промежуточных расчетов, передавать их в MS Word, сохранять в текстовых файлах, и многое другое. Встроенный язык с синтаксисом Pascal позволит создавать вычисляемые поля, определять параметры для SQL-запросов, производить различные промежуточные расчеты. Дополнительно менеджер позволяет определять формы ввода, для занесения пользователем исходных данных. Разработанные и отлаженные Читать полностью…

Автор: de1phi | в 11:23 | Рубрики: Базы данных

Select * From “TEST.DB” Test Left Outer Join “Emp.DB” Emp
On Test.Emp_ID = Emp.Emp_ID

Вместо Left вы можете также задать Right или Full.

Автор: de1phi | в 11:23 | Рубрики: Базы данных

Ниже приведен список в алфавитном порядке слов, зарезервированных Local SQL в Borland Database Engine. Имейте в виду, что данный совет публикуется “как есть”.

ACTIVE, ADD, ALL, AFTER, ALTER, AND, ANY, AS, ASC, ASCENDING, AT, AUTO, AUTOINC, AVG

BASE_NAME, BEFORE, BEGIN, BETWEEN, BLOB, BOOLEAN, BOTH, BY, BYTES

CACHE, CAST, CHAR, CHARACTER, CHECK, CHECK_POINT_LENGTH, COLLATE, COLUMN, COMMIT, COMMITTED, COMPUTED, CONDITIONAL, CONSTRAINT, CONTAINING, COUNT, CREATE, CSTRING, CURRENT, CURSOR

DATABASE, DATE, DAY, DEBUG, DEC, DECIMAL, DECLARE, DEFAULT, DELETE, DESC, DESCENDING, DISTINCT, DO, DOMAIN, DOUBLE, DROP
Читать полностью…

У молодого хакера спрашивают:
- Максим, ну что тебе нравится, кроме женщин и компьютеров?
- Как что? Девушки и калькуляторы.

Иногда схема данных требует, чтобы набор данных имел вычисляемый результат. В приложениях Delphi в случае использования SQL это возможно, но эта технология немного разнится в зависимости от используемого типа данных.
Читать полностью…

Автор: de1phi | в 11:23 | Рубрики: Базы данных

Письмо в компьютерный сервисный центр:
- Этанутипауменяпробелполомалсячеделатьто?
Ответ:
- Настоящие_программисты_не_пользуются_пробелами.

Выполнение SQL с пробелами и специальными символами в имени поля/колонки

Выполнение SQL-запросов в Delphi-компоненте TQuery (или специального средства SQL-запроса в Database Desktop, Visual dBASE или Paradox for Windows) требует специального синтаксиса для любых колонок, содержащих пробелы или специальные символы.
Читать полностью…

Автор: de1phi | в 10:22 | Рубрики: Базы данных

Этот SQL не работает для RequestLive := True : SELECT * FROM DBO.TABLE1

Этот SQL работает для RequestLive := True : SELECT * FROM “DBO.TABLE1″

Помните о том, что кавычки необходимы для обозначения имени таблицы! Также имейте в виду, что поставляемая документация говорит о том, что для таблиц Oracle кавычки не нужны! Неверно

Автор: de1phi | в 10:22 | Рубрики: Базы данных

Обнаруженная мною проблема заключается в ненормальной работе BDE с TStoredProc, когда хранимая процедура SQL получает на входе параметр типа String. Как я понял, BDE/SQL Links перед вызовом хранимой процедуры заносит в строку управляющие символы. Чтобы обойти эту проблему, Borland предлагает использовать TQuery. Конечно, ничего не стоит перевести TStoredProcs в TQuerys (с сохранением полного набора характеристик и без потери скорости), но мне стала интересна причина такого поведения компонента, и я решил покопаться в TStoredProc насколько это было мне возможно и интересно, для чего я добавил дополнительный параметр к хранимой процедуре, позволяющий указывать длину передаваемой процедуре строки. Затем, уже в процедуре, если реальная длина строки оказывалась больше, с помощью дополнительно передаваемого параметра бралась, и в дальнейшем использовалась только левая часть строки, а остальные управляющие символы игнорировались. Читать полностью…

Внутри триггера нельзя управлять транзакциями, поэтому генерируешь там исключение а откат транзакции делаешь в приложении, пославшем запрос. Естественно exception должен предварительно создан

SET TERM !!;

CREATE TRIGGER ” DELETE_INV” FOR ” TINV”
ACTIVE BEFORE DELETE
POSITION 10
AS
BEGIN
IF (EXISTS (SELECT tOst.Id FROM tOst
WHERE tOst.Id = tInv.Id))
THEN
EXCEPTION EST_OSTATOK;
END !!

SET TERM ;!!

DBase.StartTransaction;
try
Query.ExecSQL;
DBase.Commit;
except
DBase.Rollback;
raise; // Для последующей обработки
end;

Огорворимся сразу. Под SQL сервером подразумеваются сервера, выполняющие SQL запросы, к ним относятся Oracle, MS SQL, InterBase и т.д.

В стандартной поставке Delphi TUpdateSQL позволяет выполнить только одну SQL команду, но возникает ситуация, когда желательно выполнить сразу несколько команд (например: удаление из двух таблиц одновременно, когда нет возможности установить каскадное удаление (DBF, DB)) или запустить процедуру на SQL сервере. В этом случае можно обойти ограничение, навязанное Delphi в виде ошибки Update Failed, возникающей при сохранении данных.
Читать полностью…