SELECT * FROM TABLE ORDER BY INDEXFIELD DESC
и
покажет только видимые в DBGrid записи "с конца". Таким образом операцию
перехода в конец таблицы TTable выполнит практически мгновенно. Пользователи
Delphi 2.0 C/S могут сами убедиться в этом при помощи SQL Monitor.
Как получить значение генератора?
Dmitry Sergeev (Dmitry.Sergeev@f1851.n5020.z2.fidonet.org
) 18.12.1998
Для получения текущего значения генератора следует
обратится к таблице - владельцу генератора со следующим запросом:
- select
- gen_id(my_generator, 0)
- from
- RDB$DATABASE
Как получить список пользователей
Interbase?
Ivanuts V.A. (ivanuts@altavista.net )
5.12.1998
a) Если необходимо получить список зарегестрированных
пользователей на сервере InterBase, необходимо послать следующий запрос в базу
данных ISC4.GDB (находится в дирректории InterBase):
- SELECT
- USER_NAME
- FROM
- USERS
b) Если необходимо получить список зарегестрированных пользователей в
конкретной БД, можно использовать следующий запрос в эту базу данных:
- SELECT DISTINCT
- RDB$USER
- FROM
- RDB$USER_PRIVILEGES
Используя в этом запросе и другие поля таблицы RDB$USER_PRIVILEGES (без
применения директивы DISTINCT) можно также получить данные о привилегиях
зарегистрированных пользователей БД, назначенных на конкретные таблицы,
просмотры, процедуры или их поля.
Как программно сменить пароль входа на
Interbase?
Ivanuts V.A. (ivanuts@altavista.net )
5.12.1998
В своих разработках я применяю функцию Gregory H.
Deatz из библиотеки FreeUDFLib. Я немного ее перестроил, но работой ее
очень доволен. Если необходимо чтоб эта функция выполнялась на клиентском
приложении, переменная SysUName должна иметь значение 'SYSDBA'.
- const
- UM_ERROR = 100001;
- UM_CANNOT_DETERMINE_ACTION = 100002;
- UM_CANNOT_SET_ENV_ISC_USERNAME = 100003;
- UM_CANNOT_SET_ENV_ISC_PASSWORD = 100004;
- UM_SYSUSER_NOT_VALID = 100005;
- UM_SYSPASSWORD_NOT_VALID = 100006;
- UM_CANNOT_EXECUTE_PROCESS = 100007;
- function UserProp(UserName, Password, SysUName, SysPword, Action:
String): Integer;
- var
- Startup : TStartupInfo;
- Process : TProcessInformation;
- Status : DWORD;
- IB_BIN, szApp, szCmdLine : String;
- Env : Pointer;
- begin
- Result := UM_ERROR;
- Startup.lpReserved := PChar(0);
- Startup.lpDesktop := PChar(0);
- Startup.lpTitle := PChar(0);
- Startup.dwFlags := STARTF_USESHOWWINDOW;
- Startup.wShowWindow := SW_HIDE;
- Startup.cbReserved2 := 0;
- Startup.lpReserved2 := PByte(0);
- IB_BIN := GetIBPath +'\Bin';// GetIBPath - путь к дирректории InterBase
- szApp := IB_BIN + '\Gsec.exe';
- if Trim(Action) > ''
then
- begin
- case Action[1] of
- 'A': szCmdLine := szApp + ' -add ' + Trim(UserName) + '-pw ' + Trim(Password);
- 'D': szCmdLine := szApp + ' -delete ' + Trim(UserName);
- 'M': szCmdLine := szApp + ' -modify ' + Trim(UserName) + ' -pw ' + Trim(Password);
- else
-
- begin
- Result :=
UM_CANNOT_DETERMINE_ACTION;
- Exit;
- end;
- end;
- end
- else
- begin
- Result := UM_CANNOT_DETERMINE_ACTION;
- Exit;
- end;
- if ((Trim(SysUName) = 'SYSDBA')
and (not SetEnvironmentVariable(PChar('ISC_USER'), PChar(Trim(SysUName)))))
then
- begin
- Result := UM_CANNOT_SET_ENV_ISC_USERNAME;
- Exit;
- end
- else
- begin
- if (Trim(SysUName) <> 'SYSDBA') then
- begin
- Result := UM_SYSUSER_NOT_VALID;
- Exit;
- end;
- end;
- if ((Trim(SysPword) <> '') and (not
SetEnvironmentVariable(PChar('ISC_PASSWORD'), PChar(Trim(SysPword)))))
then
- begin
- Result := UM_CANNOT_SET_ENV_ISC_PASSWORD;
- Exit;
- end
- else
- begin
- if (Trim(SysPword) = '')
then
- begin
- Result := UM_SYSPASSWORD_NOT_VALID;
- Exit;
- end;
- end;
- Env := GetEnvironmentStrings();
- if (CreateProcess(
-
- PChar(szApp), //
lpApplicationName
- PChar(szCmdLine), //
lpCommandLine
- PSecurityAttributes(0), // lpProcessAttributes
- PSecurityAttributes(0), // lpThreadAttributes
- False, // bInheritHandles
- HIGH_PRIORITY_CLASS, // dwCreationFlags
- Env, // lpEnvironment
- PChar(0), // lpCurrentDirectory
- Startup, // lpStartupInfo
- Process // lpProcessInformation
- )) then
- begin
- GetExitCodeProcess(Process.hProcess, Status);
- while Status = STILL_ACTIVE
do
- begin
- Sleep(10);
- GetExitCodeProcess(Process.hProcess, Status);
- end;
- Result := Status;
- end;
- end;
InterBase и использование Кирилицы.
Да, InterBase прекрасно управляется как с кодировкой 866 так и с 1251. Да,
как в Delphi 1.0, так и в Delphi 2.0, так и в Delphi 3.0. Для того, чтобы в БД в
строковых полях использовались русские буквы, необходимо при создании БД указать
в качестве дополнительного параметра фразу:
DEFAULT CHARACTER SET WIN1251
А в BDECFG32 в драйвере InterBase и его псевдонимах (aliases) указать
языковый драйвер Pdox ANSI Cyrillic. Такие установки обеспечат нормальную
работу с кодировкой 1251.
Дополнительно, если Вы предполагаете использовать выражение UPPER в
SQL-запросах, то Вам потребуется при создании таблиц InterBase использовать
уточнение COLLATION SEQUENCE для строковых полей.
К сожалению, установить COLLATE PXW_CYRL по умолчанию для базы данных
невозможно (такой параметр отсутствует). Поэтому таблицы InterBase, созданные
при помощи Database Desktop или компонента TTable не будут иметь правильного
COLLATE для работы с функцией SQL UPPER. Эта проблема, необходимо
отметить, не относится к работе с регистром русских букв внутри Delphi,
поскольку для этого внутри VCL используются функции Windows, правильно
переводящие буквы кодировки 1251 в верхний регистр и обратно. Hапример, если
возможен запрос такого типа:
- SELECT * FROM CUSTOMERS
- WHERE
- UPPER(NAME) = 'ИВАHОВ'
То таблицу CUSTOMERS придется создавать при помощи текста:
- CREATE TABLE CUSTOMERS
- (ID INTEGER NOT NULL,
- NAME CHAR(30) COLLATE PXW_CYRL,
- PRIMARY KEY (ID))
Фраза COLLATE PXW_CYRL заставляет InterBase использовать таблицу
трансляции символов PXW_CYRL вместо WIN1251, которая
устанавливается по умолчанию для DEFAULT CHARACTER SET WIN1251. Однако
можно использовать указание порядка сортировки "на ходу", без указания порядка
сортировки в описании таблицы - при помощи того-же спецификатора COLLATE.
В этом случае запросы могут выглядеть следующим образом:
- SELECT * FROM CUSTOMERS
- WHERE UPPER(NAME COLLATE PXW_CYRL) = 'ИВАHОВ'
Учтите, что если Вы используете ORDER BY NAME, то порядок записей у
полей с COLLATE PXW_CYRL будет отличаться от имеющих только CHARACTER
SET WIN1251. В этом случае необходимо и в ORDER BY указывать
COLLATE. Hапример:
- SELECT * FROM CUSTOMERS
- WHERE
- UPPER(NAME COLLATE PXW_CYRL) = 'ИВАHОВ'
- ORDER BY NAME COLLATE PXW_CYRL
Примечание: при создании псевдонимов в Database Desktop языковый
драйвер называется "ancyrr".
Примечание: ODBC-драйвер InterBase фирмы Q+E, входящий в поставку
Delphi 1.0, не может работать с кодировкой WIN1251, так как не имеет
параметра SortOrder (как например ODBC-драйвер Access). В результате, при работе
с этим драйвером через BDE русские буквы будут видны (благодаря LangDriver
Pdox Ansi Cyrillic), но ввести их не удастся. Для приложений, работающих с
ODBC напрямую, русские буквы будут видны как бессмысленный набор символов. В
настоящее время ожидается новый 32-разрядный ODBC драйвер, в котором эти
проблемы, мы надеемся, будут решены.
Примечание: решить проблему с изменением данных в русской кодировке
при использовании ODBC-драйвера можно следующим образом: напрямую указывать
кодировку перед строковым значением, содержащим русские символы.
INSERT INTO MYTABLE VALUES (1, _win1251 'Привет!')
К сожалению, такой
способ приводит к тому, что со стандартными компонентами TTable и TQuery можно
работать только используя дополнительный компонент UpdateSQL (который позволяет
переопределить запросы выдаваемые этими компонентами при INSERT, UPDATE, DELETE,
и кроме этого присутствует только в 32-х разрядном Делфи)
Получение значения поля типа Memo без использования
объекта TDBMemo.
- Поместите, например, компонент Table1 на форму, выберите таблицу
BIOLIFE.DB.
- Установите свойство Table1.Active в True.
- Поместите на форму компоненты Edit1 (для примера) и Button1.
- Добавьте код в обработчик OnClick для Button1:
- procedure Tform1.Button1Click(Sender : TObject);
- var
- Bs : TblobStream;
- P : array[0..50] of Char;
- begin
- FillChar(P, SizeOf(P), #0);
- Bs := TblobStream.Create(Table1.FieldByName('Notes'), bmRead);
- try
- Bs.Read(P, 50);
- finally
- Bs.Free;
- end;
- Edit1.Text := StrPas(P);
- end;
Оглавление
Назад