FAQ - Вопросы - ответы - советы - Базы данных
Вопрос:
Как работать из DELPHI напрямую с MS ADO (MICROSOFT ACTIVE DATA OBJECTS)?
Ответ:
Итак, хочу поделиться некоторыми достижениями... так на всякий случай. Если у вас вдруг потребуется сделать в своей программке доступ к базе данных, а 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.