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

Автор: Scott Gammans

Окошко: “Программа Microsoft не совершила никакой ошибки, но по привычке будет закрыта”.

…я получил сегодня Delphi, установил и перекомпилил тестовое приложение.

При подключении к источнику данных ODBC, данная последовательность вызывает утечку памяти без возникновения GPF:

Prepare->ExecSQL->ExecSQL->ExecSQL->…
C установленной Delphi это еще требует подготовку (prepare) каждого запроса:

Prepare->ExecSQL->Unprepare->Prepare->ExecSQL->Unprepare->…

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

…я обращал ваше внимание на трудности коннекта Delphi-приложений с Watcom. За исключением досадной проблемы с чуствительностью регистров у ODBC драйверов (которая пропадает после установки соответствующих заплаток), мое приложение действительно лучше соединяется с базой данных Watcom, чем LIBS. Вот функция, которую я использую для подключения к серверу:

function TLogonForm.LogonToServer: Boolean;
begin
LogonToServer := FALSE;
MyDatabase.AliasName := DatabaseEdit.Text;
MyDatabase.Params.Values[’USER NAME’] := UserIDEdit.Text;
MyDatabase.Params.Values[’PASSWORD’] := PasswordEdit.Text;
MyDatabase.Params.Values[’SERVER NAME’] := ServerName;
try
MyDatabase.Connected := TRUE;
LogonToServer := TRUE;
except
on E: EDatabaseError do
MessageDlg(’Программа не в состоянии подключиться к
серверу баз данных по следующей причине:
‘ + #10 + #10 + E.Message, mtError, [mbOK], 0);
end;
end;
Читать полностью…

Я как-то обращал ваше внимание на трудность получения дескриптора ODBC соединения посредством DBE. После тесного общения со службой поддержки Borland, я наконец нашел решение как это сделать. Вот этот код:

unit Getprop;

interface

uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, Grids, DBGrids, StdCtrls, DB, DBTables,
DBIProcs, DBITypes, DBIErrs;

type
TForm1 = class(TForm)
Table1: TTable;
DataSource1: TDataSource;
Button1: TButton;
Button2: TButton;
DBGrid1: TDBGrid;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
Table1.active := True;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
hTmpDB: hDBIDb;
iLen: word;

begin
Check(DbiGetProp(hDBIObj(Table1.DBhandle), dbNATIVEHNDL, @hTmpDB,
sizeof(hDBIDb), iLen));
Edit1.text := inttostr(longint(htmpdb));
end;

end.

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

Представляю вашему вниманию инструкцию по конфигурированию ODBC и источника данных.

Для того, чтобы Borland Database Engine мог пользоваться драйверами ODBC, они должны быть сконфигурированы следующим образом:

Инсталлируйте драйвер и установите его в Панель Управления/ODBC administrator.
Если это файл базового драйвера типа dBase, Paradox, Excel, FoxPro и др., то вы должны указать каталог, содержащий ваши файлы.
Access и Local Btrieve файлы должны указывать на конкретный файл базы данных (Btreive на File.ddf, Access должен указывать на файл с расширением .MDB).
Если это линк (connection) к базе данных, например Oracle, Sybase, Interbase, и др., вы должны указать на этот линк. Обычно транспорт посредством TCPIP, SPX/IPX, NetBEUI и т.п. предусматривается поставщиком программного обеспечения. Каждый драйвер работает с транспортным протоколом по-своему.
Запустите Database Engine Configuration Utility. (BDECFG.EXE)
Выберите New ODBC Driver.
Задайте имя вашему драйверу (к имени автоматически добавится “ODBC_”.)
Выберите ваш ODBC Driver из списка Default ODBC Driver List.
Выберите имя источника данных по умолчанию.
Создайте псевдоним (alias), указывающий на установленный вами драйвер.
Установите ссылку с именем псевдонима на ваш драйвер.
Примечание относительно баз данных Access 2.0: вам необходимо иметь самые последние драйверы от Microsoft. Имеющиеся драйверы позволяют работать только с базами данных Access 1.0, не выше.
Стоимость нового набора драйверов у самой Microsoft составляет $10, что эквивалентно цене носителя и пересылки.

Для работы с Access 2.0 вам необходимо использовать источник данных с именем “Microsoft Access Driver” или “Microsoft Access 2.0 Databases”.

Имейте в виду, что “Access Data” и “Access Files” по умолчанию являются источниками данных только для Access 1.0. Поэтому для получения доступа к MDB-файлам Access 1.0 пользуйтесь “Access Data”.

Btrieve также создает источник данных по умолчанию “Btrieve Data” и “Btrieve Files”. Используйте “Btrieve Data” как ваш источник данных по умолчанию. Драйверы Btrieve позволяют использовать данные btrieve вплоть до версии 5.0. Для работы с Btrive данными более новой версии, необходим новый набор драйверов Microsoft или Intersolve Q+E.

Настройка ODBC в Панели Управления

При инсталляции, Delphi устанавливает в Панель Управления апплет “ODBC” (далее - “настройка ODBC”). “Настройка ODBC” содержит доступные источники данных (драйвера), установленных для использования ODBC. Как вы можете видеть на главной странице “Data Sources”, ODBC содержит внушительный набор форматов, которые могут использоваться в Delphi. Дополнительные форматы поддерживаются установленными драйверами и могут быть добавлены с помощью кнопки “Add…”.

Для добавления нового или удаления существующего драйвера:

В окне “Data Sources” нажмите кнопку “Drivers…”. В появившемся диалоговом окне “Drivers” нажмите кнопку “Add…” и укажите путь к новому драйверу ODBC.
Возвратитесь в окно “Data Sources” и добавьте доступные с новым драйвером источники данных с помощью кнопки “Add…”.
Для настройки конкретного источника данных используйте кнопку “Setup…”. Функция кнопки “Setup…” меняется с каждым форматом данных. Частенько настройки типа рабочей директории для драйвера настраиваются как раз в этом месте.
Разделы электронной справки доступны для каждой страницы и диалогового окна “Настроки ODBC”.
BDE CONFIGURATION UTILITY

После установки драйвера ODBC, запустите BDE Configuration utility для конфигурации BDE для работы с новым драйвером.

На странице драйверов нажмите на кнопку “New ODBC driver”.
Появится диалог с заголовком “Add ODBC driver”. Опция “SQL link driver” позволяет выяснить, с какими типами баз данных можно работать с помощью данного драйвера ODBC.
Затем выбирайте default ODBC driver (драйвер ODBC по-умолчанию). Выпадающий список содержит список типов файлов, поддерживаемых установленными в системе драйверами ODBC.
Выберите для ODBC-драйвера источник данных по-умолчанию (default data source). Имея уже установленный на шаге 3 драйвер ODBC, список этого combobox’а будет содержать имена источников данных, подходящих для использования с выбранным драйвером.
Нажмите Ok.
Возвратитесь на страницу драйверов, выберите File/Save из главного меню и сохраните данную конфигурацию.
Создание псевдонима в DATABASE DESKTOP
Хотя создать псевдоним ODBC можно и из BDE Configuration utility, Database Desktop предоставляет более комфортное решение.

В меню “File” выберите пункт “Aliases..”.
В появившемся диалоге “Alias Manager” нажмите кнопку “New”.
Введите имя вашего нового псевдонима в поле редактирования, помеченной как “Database Alias”.
Используя выпадающий список “Driver Type” (типы драйверов), выберите драйвер, подходящий для данного псевдонима. Таблицы Paradox и dBase считаются STANDARD. Если в BDE Configuration utility драйвер ODBC был правильно сконфигурирован, то его имя появится в списке.
Дополнительные опции опции могут появляться в зависимости от выбранного типа драйвера.
После завершения всех описанных действий сохраните новый псевдоним, выбрав “Keep New”. Затем нажмите “Ok”. Появится подсказка, спрашивающая о необходимости сохранения псевдонима в IDAPI.CFG. Выберите “Ok”.
Теперь псевдоним будет работать и в Database Desktop, и в Delphi.

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

uses Registry;

procedure TForm1.GetDataSourceNames(System: Boolean);
var
reg: TRegistry;
begin
ListBox1.Items.Clear;

reg := TRegistry.Create;
try
if System then
reg.RootKey := HKEY_LOCAL_MACHINE
else
reg.RootKey := HKEY_CURRENT_USER;

if reg.OpenKey(’\Software\ODBC\ODBC.INI\ODBC Data Sources’, False) then
begin
reg.GetValueNames(ListBox1.Items);
end;

finally
reg.CloseKey;
FreeAndNil(reg);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
//Системные DSNs
GetDataSourceNames(True);
//Пользовательские DSNs
GetDataSourceNames(False);
end;

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

Объект: SQL Server

Некоторые вопросы, с которыми мне пришлось столкнуться (некоторые из них могут быть решены в самых последних обновлениях и версиях Delphi/BDE/SQL Links):

TStoredProc не может работать с SQL Server 6.0 и ODBC. Delphi передает дополнительный параметр для возвращаемого значения процедуры, который не может “переварить” SQL 6.0. Такая же проблема была и в 4.21, но 4.21 не имел проверку этих параметров. Для использования хранимых процедур вы должны использовать TQuery.

TStoredProc с SQL Links имел ошибку в параметрах строки, заключающуюся в неправильном заполнении максимальной длины управляющих символов. Это калечило хранимые данные и делало так, что результаты, получаемые с любым выражением WHERE и использованием такого параметра никогда не соответствовали ожидаемым и действительным.

TStoredProc не прозрачен между SQL Links и ODBC. Если вы создаете компонент TStoredProc при связи посредством SQL Links, и запустите приложение с использованием соединения ODBC, это работать не будет. Delphi создает два различных (и несовместимых) синтаксиса для возвращаемого значения процедуры. Вы не можете переключаться между SQL Links и ODBC (в любом направлении).

Из-за проблем TStoredProc, описанных выше (и поскольку нам необходимо иметь возможность работы приложений со множеством SQL-серверов), для вызова хранимых процедур мы используем TQuery. Я не могу узнать как мне получить значение выходного параметра от хранимой процедуры, используя TQuery. Соединения ODBC всегда возвращают Null. Соединения SQL Links также возвращают Null или ошибку синтаксиса процедуры. Borland же требует безукоризненной работы. Я надеюсь что это сделать все-же можно, только мне пока не сообщили как. Многие программисты говорят об аналогичных проблемах.

Соединения ODBC игнорируют базу данных, определенную в источнике данных ODBC и всегда подключаются к основной (мастер) базе данных. Если вы определяете базу данных по умолчанию для пользователей SQL Server, она *будет* подключаться. Это проблема, похоже, относится только к драйверам Microsoft ODBC и как с ними работает Delphi. Некоторые сообщают, что драйвер Intersolv работает правильно.

Вы не должны забывать сбрасывать все запросы перед началом нового. SQL Server не допускает множества курсоров в одном соединении с базой данных, так что, если вы начинаете с запроса, возвращающего установленный результат, вам необходимо убедиться, что приложение выбрало все строки (TQuery.Last) перед началом другого запроса. Или перед началом другого запроса не забывайте закрывать предыдущий (TQuery.Close). Если вы не сделаете этого, вы увидете “Connection is in use by another statement” (Соединение используется другим запросом) при вашем следующем запросе.

Тем не менее, если вы вызываете TQuery.Prepare перед запуском вашего запроса, TQuery.Close не закроет соединения. Убей не знаю почему. Я начал получать целую кучу ошибок “Connection is in use by another statement” там, где я закрыл запрос перед началом следующего. Я потратил пару часов прежде чем выяснил, что мой вызов Prepare аннулирует вызов TQuery.Close.

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

execute pb_creditapp_update(
:iAPPLICATION_ID,
:iCURUSER_ID,
:iNAME,
:iADDRESS,
:iCITY,
и т.д. для нескольких строк.
TQuery требует несколько секунд, чтобы “заполнить себя”. Дело в том, что для каждой SQL-строки, добавляемой к компоненту, TQuery уничтожает свой внутренний список параметров и полностью создает его вновь. Так что, если вы имеете 50 параметров в разных строках, TQuery 50 раз пересоздаст внутренний список параметров.

У меня были проблемы с использованием RAISERROR в качестве исключения в Delphi. Обычно это классно работает. Но если вы используете это в хранимой процедуре после того, как ваша хранимая процедура что-то сделала для установления результата (SELECT), то RAISERROR не возвращается в Delphi в виде исключения (или ODBC, или SQL Links). Visual Basic это “получает” как положено, поэтому я подразумеваю, что это какая-то проблема с BDE. Если вы используете RAISERROR перед любым запросом, который устанавливает результат, то это работает как надо.

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

…хорошо, можете мне не верить, но я могу прикрутить BDE/ODBC/SQL Server 6.0 для моей работы. И даже с той проблемой, с которой вы ко мне обратились (ошибка открытия базы данных), это может работать и у вас.

Шаг #1. Убедитесь в том, что драйвер SQL Server ODBC имеет версию не ниже is 2.50.0121. Это можно сделать двумя путями: запустить ODBC Administrator, щелкнуть на закладке с драйверами, выбрать SQL Server и щелкнуть на кнопке “About”. Другой способ немного проще (простите за сарказм после описания вашего способа): вы можете просто сообщить 16-битной Windows о том, что вы работаете с версией драйвера 2.50.0121 ODBC и установить его по умолчанию в параметрах SQL Server!

Это не шутка (!!!). Я говорил по этому поводу с группой поддержки Microsoft, и они сообщили мне, что если я не буду использовать версию 2.50.0121 драйвера ODBC, то я получу кучу проблем, особенно с функциями “Catalog” (которые, как я понимаю, по умолчанию включены в набор функций базы данных). При установке этой версии драйвера, любые попытки “поговорить” с SQL Server через ODBC возвращали ошибку SPXListenForPacket (или типа этой). Я позвонил в группу поддержки Microsoft, на что они ответили: “О, да. Забудьте об этом. Драйвер ODBC не работает с SQL Server 6.0 с параметрами по умолчанию SQL Server 6.0.”

Шаг #2. “Сбросьте” размер сетевого пакета, используемого SQL Server 6.0 (установите его равным 512 байтов). Я не помню точное его значение, но вы можете справиться в руководстве по SQL Server 6.0. Надеюсь что помог вам!

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

Минимальные требования, необходимые для установки драйвера ODBC в Delphi 3.0, заключаются в наличие следующих компонентов:

Microsoft ODBC Manger
Windows 95 или NT
Delphi версии Developer или Client/Server
Поставляемый производителем драйвер ODBC (уже установленный в вашей системе)
При использовании Delphi 3.0 есть два общих метода добавления ODBC драйверов к BDE. Первым шагом при использовании любого из методов является установка постовляемого производителем драйвера ODBC в вашу систему. После этого достаточно сложного шага остальные шаги будут не такими сложными. В левой панели менеджера BDE расположен список драйверов и источников данных, которые прежде были ориентированы на использование с приложениями BDE.
Метод A:

Для начала запустите из меню Windows Start BDE Administrator (он должен располагаться в папке Delphi 3.0.)
Читать полностью…