{codecitation class="brush: pascal; gutter: false;" width="600px"}

Автор: Nomadic

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

var

OptionalParam: OleVariant;

VarData: PVarData;

begin

OptionalParam:= DISP_E_PARAMNOTFOUND;

VarData:= @OptionalParam;

VarData^.VType:= varError;

после этого переменную OptionalParam можно передавать вместо неиспользуемого аргумента.

Далее, самый приятный способ получения Result sets:

Там есть масса вариантов, но как выяснилось оптимальным является следующий вариант, который позволяет получить любой желаемый вид курсора (как клиентский, так и серверный)

var

MyConn: _Connection;

MyComm: _Command;

MyRecSet: _Recordset;

prm1: _Parameter;

begin

MyConn:= CoConnection.Create;

MyConn.ConnectionString:= 'DSN=pubs;uid=sa;pwd=;'; MyConn.Open ('', '', '', −1);

MyCommand:= CoCommand.Create;

MyCommand.ActiveConnection:= MyConn;

MyCommand.CommandText:= 'SELECT * FROM blahblah WHERE BlahID=?'

Prm1:= MyCommand.CreateParameter ('Id', adInteger.adParamInput, −1, );

MyCommand.AppendParameter (Prm1);

MyRecSet:= CoRecordSet.Create;

MyRecSet.Open (MyCommand, OptionalParam, adOpenDynamic, adLockReadOnly, adCmdText);

… теперь можно фетчить записи. Работает шустро и классно. Меня радует. Особенно радуют серверные курсоры.

Проверялось на Delphi 3.02 ADO 1.5 MS SQL 6.5 sp4. Пашет как зверь.

Из вкусностей ADO — их легко можно использовать во всяких многопоточных приложениях, где BDE порой сбоит, если, конечно, ODBC драйвер грамотно сделан…

Ну и еще можно использовать для доступа к данным всяких там «нестандартных» баз типа MS Index Server или MS Active Directory Services.

В Delphi (как минимум в 4 версии) существует «константа» EmptyParam, которую можно подставлять в качестве пустого параметра.

{/codecitation}