Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2009.05.17;
Скачать: [xml.tar.bz2];

Вниз

ADO и MS SQL - посоветуйте хорошую ссылку   Найти похожие ветки 

 
kaif ©   (2008-09-08 21:03) [0]

Пишу приложение для базы MSSQL. Решил в приложении использовать ADO. Не могу найти хорошей статьи с примерами.

Например, у меня есть справочники.
Конструкция типа:

INSERT INTO GOODS(GOODS_NAME) VALUES(:NAME)
SELECT :ID = @@IDENTITY

у меня в ADOQuery.ExecSQL не сработала. То есть сработала, но несмотря на то, что я  явно задал 2 параметра (NAME и ID), один как Dirction = pdInput, а другой - pdOutput, после ExecSQL у меня в выходном параметре присутствует NULL.

Я написал хранимую процедуру, возвращающую набор данных:

CREATE PROCEDURE SP_INSERT_GOOD(@NAME VARCHAR(60))
AS
BEGIN
 INSERT INTO GOODS(GOOD_NAME) VALUES(@NAME)
 SELECT :ID = @@IDENTITY
END


И, используя метод ADOQuery.Open, получил желаемое.
Однако мне это решение кажется каким-то кривым.
Хотелось бы увидеть что-нибудь традиционно принятое в этой связке Delphi6-ADO-MSSQL2000.

Буду благодарен за любую информацию.
С уважением.


 
stas ©   (2008-09-08 21:08) [1]

INSERT INTO GOODS(GOODS_NAME) VALUES(:NAME)
SET :ID = @@IDENTITY

ADOQuery.ExecSQL


 
sniknik ©   (2008-09-08 22:04) [2]

> после ExecSQL у меня в выходном параметре присутствует NULL.
либо врешь либо ошибка в 17й строке.

stas ©   (08.09.08 21:08) [1]
> SET :ID = @@IDENTITY
SELECT :ID = @@IDENTITY то же самое по сути, только стиль новее.


 
sniknik ©   (2008-09-08 22:06) [3]

> ADOQuery
кстати заменил бы ты его на ADOCommand


 
Медвежонок Пятачок ©   (2008-09-08 22:08) [4]

у меня в ADOQuery.ExecSQL не сработала.

ADODataSet и ADOCommand. Все остальное не использовать.


 
Медвежонок Пятачок ©   (2008-09-08 22:18) [5]

TAdoCommand + "insert into TABLENAME values(.........)"
+
TAdoDataSet + select IDENT_CURRENT("TABLENAME")


 
sniknik ©   (2008-09-08 22:27) [6]

Медвежонок Пятачок ©   (08.09.08 22:18) [5]
нет смысла разделять команды. опасно. а если возвращать значение через рекордсет, то тогда и инсерт тоже в TAdoDataSet  перенести.


 
Anatoly Podgoretsky ©   (2008-09-08 22:34) [7]

> sniknik  (08.09.2008 22:27:06)  [6]

О чем речь, о получение идентити?
Тогда просто insert + select в одной команде.


 
Медвежонок Пятачок ©   (2008-09-08 22:37) [8]

можно и в одном. еще лучше пересесть на 2005 и заюзать output для инсерта


 
kaif ©   (2008-09-08 22:52) [9]

2 sniknik ©   (08.09.08 22:06) [3]
Ух ты, спасибо, я вообще не разглядел ADOCommand на палитре...

Однако все равно не работает.

 with ADOCommand1 do
 begin
   CommandText := "INSERT INTO GOODS(GOOD_NAME) VALUES (:NAME)"#13+
                           "SET :ID = @@IDENTITY";
   Parameters.ParamByName("NAME").Value := AName;
   Execute;
   ShowMessage(IntToStr(Parameters.ParamByName("ID").Value));
 end;


Ошибка та же. Значение выходного параметра все равно имеет значение Null (в смысле variant).

Пробовал оба синтаксиса, и SELECT и SET. Разницы никакой.


 
stas ©   (2008-09-08 22:56) [10]

странно, поставь дирекшин InputOutput


 
kaif ©   (2008-09-08 23:17) [11]

stas ©   (08.09.08 22:56) [10]
странно, поставь дирекшин InputOutput

Давно стоит.
Если у всех это работает, буду биться с настройками, транзакциями и т.п.

я проверил, не стоит ли режим IMPLICIT_TRANSACTIONS на сервере.

select case when (@@options & 2) = 2 then "IMPLICIT" else "NOT IMPLICIT" end

Вроде бы не стоит.
Даже не знаю, с чем это все может быть связано.


 
kaif ©   (2008-09-08 23:35) [12]

В принципе мне нравится решение Медвежонок Пятачок ©   (08.09.08 22:18) [5], если перевести в TAdoDataSet. Мне не очень нравится запрашивать @@IDENTITY по честному. Но это похоже на мое решение с хранимой процедурой. Неприятно то, что для того чтобы сделать инсерт я в программе вынужден делать Open. Как-то неаккуратненько.
К тому же я не люблю не разобравшись в причине брать альтернативное решение. А вдруг мне еще где-нибудь понадобится вернуть параметр?
Что я буду делать?

Вот я сделал такой запрос для исследования:

 with ADOCommand1 do
 begin
   CommandText := "SELECT :ID = @@Error";
   Execute;
   ShowMessage(IntToStr(Parameters.ParamByName("ID").Value));
 end;


Все отлично. Выходной параметр установлен, значение равно 0.
Значит дело в том, что у меня пакет.
Вот такой текст уже не сработал:

 with ADOCommand1 do
 begin
   CommandText := "INSERT INTO GOODS(GOOD_NAME) VALUES (:NAME)"#13+
                  "SELECT :ID = @@Error";
   Parameters.ParamByName("NAME").Value := AName;
   Execute;
   ShowMessage(IntToStr(Parameters.ParamByName("ID").Value));
 end;


Причем запись вставилась, а вот второй запрос, похоже, то ли не отработал вообще, то ли не сумел донести выходной параметр до места назначения.

А вот так сработало:

 with ADOCommand1 do
 begin
   CommandText :=
                  "BEGIN TRAN"#13+
                  "INSERT INTO GOODS(GOOD_NAME) VALUES (:NAME)"#13+
                  "SELECT :ID = @@IDENTITY"#13+
                  "COMMIT TRAN";
   Parameters.ParamByName("NAME").Value := AName;
   Execute;
   ShowMessage(IntToStr(Parameters.ParamByName("ID").Value));
 end;


Буду благодарен за комментарии к этому месту. Что произошло?
И подскажите, пожалуйста, как написать так, чтобы транзакция не повисла в случае, например нарушения уникального ключа при вставке.


 
sniknik ©   (2008-09-08 23:42) [13]

> Однако все равно не работает.
в коде нет указания типа параметра, а говоришь что он pdOutput.
как знал, что врешь.


 
Медвежонок Пятачок ©   (2008-09-08 23:44) [14]

у меня аналогично.
set устанавливает значение, select не устанавливает

insert into test_table(name) values("test")
set :id = @@identity


 
sniknik ©   (2008-09-08 23:47) [15]

> О чем речь, о получение идентити?
да
> Тогда просто insert + select в одной команде.
это вариант от "пятачка", а изначально попытка вернуть через параметр. оба варианта работают. если бы не 17я строка...


 
sniknik ©   (2008-09-08 23:48) [16]

> set устанавливает значение, select не устанавливает
не может быть... это разные формы одного и того же.
счас проверю.


 
Медвежонок Пятачок ©   (2008-09-08 23:50) [17]

я уже раза четыре проверил.


 
Медвежонок Пятачок ©   (2008-09-08 23:52) [18]

ой нет. все работает


 
Медвежонок Пятачок ©   (2008-09-08 23:56) [19]

запрос был в дизайнтайме и после смены текста commandtext тип параметра сбрасывался в инпут


 
Германн ©   (2008-09-09 01:12) [20]

<offtop>
Я конечно полный лох в работе с серьёзными БД (типа круче Парадокса), но вот уже создалось стойкое впечатление, что не всё так гладко в датском королевстве ADO при работе с параметрами в runtime.
</offtop>


 
sniknik ©   (2008-09-09 01:46) [21]

> но вот уже создалось стойкое впечатление
и кто это тебя так "впечатлил"?

> при работе с параметрами в runtime.
а как оно вообще в дельфи с неинициализированными локальными переменными? полный ведь "тухляк" не так ли?
и то, что в прошлый вызов функции какоето значение присваивалось ничуть не помогает при текущем вызове, а нынешнее присвоение не поможет при следующем вызове... вот ведь бардак! ну, что хотят то и творят эти борландовцы!


 
kaif ©   (2008-09-09 02:01) [22]

sniknik ©   (08.09.08 23:42) [13]
> Однако все равно не работает.
в коде нет указания типа параметра, а говоришь что он pdOutput.
как знал, что врешь.


Я не вру. Я с самого начала задал persistent-свойства коллекции Parameters, добавив в нее в дизайнере два параметра руками: с именем NAME (pdInput) и ID (pdOutput).
Ты прочитал мой последний пост (kaif ©   (08.09.08 23:35) [12] ) ?
Там ведь я прямо говорю, что после добавления в пакет явного старта транзакции все заработало.

Но объяснения я пока не знаю.
Хотелось бы понять логику этого самого ADOCommand при работе с пакетом команд.

И еще: что за транзакция стартовала? Вложенная?
Где почитать про грамотную работу с транзакциями MSSQL конкретно применяя компоненты ADO Delphi ? Мои поиски пока не увенчались успехом, к сожалению. Может Anatoly Podgoretsky © что-то подскажет?


 
Германн ©   (2008-09-09 02:05) [23]


> sniknik ©   (09.09.08 01:46) [21]

Коля. Спорить почти не буду. Ибо
> Я конечно полный лох в работе с серьёзными БД (типа круче
> Парадокса).

Но при работе с Парадоксом через BDE у меня никогда проблем не было.
Но и  
> вот ведь бардак! ну, что хотят то и творят эти борландовцы!

А что ADO компоненты писали борландовцы?


 
Anatoly Podgoretsky ©   (2008-09-09 07:46) [24]

> Германн  (09.09.2008 2:05:23)  [23]

А кто?


 
Медвежонок Пятачок ©   (2008-09-09 08:44) [25]

стойкое впечатление, что не всё так гладко в датском королевстве ADO при работе с параметрами в runtime.

В самом королевстве еще ничего, а вот в делфийской обертке вокруг него точно есть косяки. причем не только с параметрами


 
sniknik ©   (2008-09-09 08:59) [26]

> Я не вру.
от меня это выглядит по другому... ты даешь часть кода и про ту часть которую не даешь говоришь "там все нормально там я ставлю вот это", когда же после показываешь вторую часть, в которой типа проблем нет. первое что бросается в глаза ты НЕ ЗАДАЕШЬ тот параметр который говорил задаеш...
я не говорю что ты специально, но то что ты врешь очевидно. если бы не скрывал и дал обе половинки кода сразу то я бы сказал заблуждаешься, а так....

> Я с самого начала задал persistent-свойства коллекции Parameters, добавив в нее в дизайнере два параметра руками: с именем NAME (pdInput) и ID (pdOutput).
а запрос вносишь после... забавно, а если в запросе другие параметры используются что делать дельфе?
так получается что тебе все равно, толи сесть в автобус и поехать толи сначала поехать потом сесть в автобус... только первое это повседневность, а второе каскадерский трюк.  

> что после добавления в пакет явного старта транзакции все заработало.
есть 2 обьяснения, первое ну ты наверное понял уже - ты врешь.
второе, запрос вносимый совпал с тем что уже вбит в дизайне, при полном добуквенном совпадении очевидно и параметры теже, смысла переинициализировать их нет... вот они и остались с настроенными уже типами. (по аналогии с локальными переменными, тебе повезло и созданная переменная заняла туже память что при предыдушем вызове, и значит осталась инициализирована старым значением)
больше склоняюсь к первому объяснению... из-за вот этого - #13, с трудом представляю чтобы такой перенос строки мог быть внесен в десигне, т.е. побуквенного совпадения не предвидится... хотя есть вероятность конечно какихто преобразований до сравнений (ни проверять ни лесть в генофонд неохота, проше думать что ты вреш пока ты этого не опровергнеш(или нет, в первом случае ты подтвердил) показав и вторую часть кода...).  

Германн ©   (09.09.08 02:05) [23]
> Но при работе с Парадоксом через BDE у меня никогда проблем не было.
у меня и при работе с ADO проблем никогда не было, даже когда они реально были в компонентах (была пара известных и уже пофиксенных багов), а все почему? думаешь изза того, что я такой умный? хотелось бы, но нет. просто первым, что сделал это прочитал документацию. и главное не просто прочитал, а еще и следовал ей (просто чтение никому не помогает), ее рекомендациям (например использовать ADOQuery/... только для перехода с BDE, т.е. такого временного решения пока не изучишь основные (/быстрого перевода BDE программы на ADO, за счет ухудшения работы собственно программы). я не переходил, я изучал, поэтому сразу взялся за основные забыв про "BDE заглушки", а основные проблемы(те баги о которых выше) именно с ними и были).


 
Медвежонок Пятачок ©   (2008-09-09 09:11) [27]

(была пара известных и уже пофиксенных багов)

Там даже не баги, а урезанная реализация некоторых возможностей.
Например беседовал с разработчиками провайдера к ИБ (lcpi ib provider), когда возник трабл с блобами. ("произошла ошибка во время выполнения многофазной операции .....")
Сам провайдер поставляется в трех версиях. Мне отвечают: в адо экспресс (delphi) возможна работа только с первой версией, бла бла бла, и еще возьмите самый последний триал.
Беру, проверяю. А там все тоже самое. На ровном месте: insert into values + блоб параметры


 
Anatoly Podgoretsky ©   (2008-09-09 10:27) [28]


> Я конечно полный лох в работе с серьёзными БД (типа круче
> Парадокса), но вот уже создалось стойкое впечатление, что
> не всё так гладко в датском королевстве ADO при работе с
> параметрами в runtime.

Вообще то так и есть, реализация параметров в ADO.VCL грешит множеством ошибок, решается переходом на более старшие версии Дельфи, что мне в свое время и пришлось вынужденно сделать. И я не уверен, что Борланд устранил все ошибки, просто требуемые мне свойства заработали в 2006, а я последовательно проверял версии от Д5 до Д2006 и это ошибки именно Борланда, а не самого АДО, они почему то решили, что [N]VARCHAR это FixedChar, а Автоинкримент это Integer и так еще с несколькими типами. А модуль АДОDB построен так, что даже при желании правкой генофонда не проблему не решить, модуль не перекомпилируется, а только делает вид.
В то же время для не параметров эти типы реализованы правильно, и рантайм задача тоже решения не имеет, как ни указывай явно тип, он все равно меняется на FixedChar и прочее.
Судя по некоторым другим признакам, не все ошибки этого рода устранены и в 2006


 
b z   (2008-09-09 11:08) [29]


> kaif ©   (08.09.08 21:03)  
> SELECT :ID = @@IDENTITY
поясните. что это?

> CREATE PROCEDURE SP_INSERT_GOOD(@NAME VARCHAR(60))
CREATE PROCEDURE SP_INSERT_GOOD(@NAME VARCHAR(60), @ID INT OUTPUT) ?
+

> SELECT :ID = @@IDENTITY
SELECT @ID = SCOPE_IDENTITY()
если так?


 
Ega23 ©   (2008-09-09 11:22) [30]

Set NoCount On;
Insert into ... (...) Values (....);
Select Result=Scope_Identity();

Выполнять через TADODataSet.Open;
Брать результат либо через TADODataSet.Fields[0[ либо через обычный FieldByName


 
sniknik ©   (2008-09-09 11:42) [31]

> Там даже не баги, а урезанная реализация некоторых возможностей.
имел в виду именно баги, например был баг при внесении запроса частями через ADOQuery.SQL.Add(), чего по логике ADO делать было нельзя т.к. при внесении запроса определяются какието параметры, и определяются они на стороне сервера куда передается запрос, часть же всегда неправильна... кстати именно поэтому нужно подключение при разработке, можно конечно и без него и руками все устанавливать, толко основные претензии по этому поводу как раз в том что оно чегото не делает, а вот то что программист должен обеспечить какието условия для этого, это игнорируется.

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

Anatoly Podgoretsky ©   (09.09.08 10:27) [28]
> Вообще то так и есть ...
вообщето это новая информация, не тронутая обсуждением до этого момента, а вывод "там чтото не то"  сделан смотря на когото у кого проблемы т.к. он инструкцию не прочитал, хотя на самом деле это все работает.
это все чем то похоже на выражение (гдето слышал) "если пристально на когото смотреть, любого можно принять за шпиона", т.е. выдать желаемое за действительное.

можно кстати конкретнее, чем то что написано мешает(дает глюки) в работе? (то что в приведении типов допущены огрехи неудивительно, но может в этом есть смысл? например FixedChar передавать кудато проще чем реализовывать полноценный механизм передачи строк именно переменной длинны, и кстати ничуть не затратнее по памяти если вначале посылки стоит длинна и памяти выделяется строго под данные, то какое значение имеет то что тип прописан максимумом длинны?)

b z   (09.09.08 11:08) [29]
Ega23 ©   (09.09.08 11:22) [30]
блин люди! да вы читать то умеете? и читаете ли что до этого было? прежде чем выдавать образцы корявого кода.

> SELECT :ID = @@IDENTITY
поясните. что это?
это правильное присвоение значения Output параметру. то что у когото он не является Output хотя он говорит обратное. не показатель того что это не работает.


 
Ega23 ©   (2008-09-09 12:20) [32]


> блин люди! да вы читать то умеете? и читаете ли что до этого
> было? прежде чем выдавать образцы корявого кода.


А что я корявого выдал?


 
kaif ©   (2008-09-09 12:29) [33]

2 sniknik ©  

Странно.
Ты так настаиваешь на том, что я вру, что я уже стал рыться в глубинах подсознания, пытаясь отыскать мотив того, зачем мне тебе врать. Правда так и не нашел. Логичнее предположить, что это какие-то твои собственные проекции.

Ты видно не понял, что я ставлю некоторые эксперименты, прежде чем что-то юзать.

Мне проще было установить параметры для эксперимента руками в коллекцию, задать не только их direction, но даже и типы данных. Раз уж существует дизайнер. Я же не привожу ту часть кода, где у меня выполняется TADOCommand.Create, к примеру. И ты вроде бы не упрекаешь меня в том, что я сам компонент еще не создал, а чего-то от него уже хочу. Или ты не в курсе того, что чтобы пользоваться TADOCommand нужно сначала создать экземпляр этого класса?
Если ты по любому поводу готов упрекать человека во вранье, я впредь конкретно для тебя буду приводить код, специально переписанный для тебя  в форме типа:

 MyCommand = TADOCommans.Create(nil)
 try
   MyCommand.Connection := ...
   и так далее, включая добавление параметров и всего такого
   MyCommand.Execute;
 finally
   MyCommand.Free;
 end

Но я всего этого делать не буду.
Так как после таких вот перлов

имел в виду именно баги, например был баг при внесении запроса частями через ADOQuery.SQL.Add(),

я просто понял, что ты не очень понимаешь, в какой последовательности в VCL работают элементарные вещи, например, что такое тип TStrings, в какой момент осуществляется парсинг текста запроса, как создается сама коллекция Parameters и кем именно.

Если бы ты это все понимал, то заметил бы, что у меня нет проблемы с тем, что параметр не найден (метод ParamByName вернул nil). И нет проблемы с тем, что в него что-то не записывается из-за "неопределенности direction", так как при наличиии одной команды в пакете (SELECT :ID = @@Error) прекрасно записывается. И дело здесь именно в том, что я прошу выполниться пакету команд, а не отдельно взятой команде. Так как с пакетами MSSQL я работаю впервые я хотел услышать мнение опытных людей. Точнее даже не мнение, а хотя бы ссылку на литературу с примером использования ADO Delphi конкретно в этом случае.

Что же я услышал от тебя кроме упреков в том что я вру?
Да ничего дельного в данном случае не услышал.
Впрочем, я ничего и не требовал.
Странно, видно тебе кажется, что ты мне обязан отвечать на мои вопросы, будто я тебя к чему-то принуждаю или чем-то задеваю. Иначе ты был бы выжливее и не стал бы обсуждать мою персону вместо того чтобы осбуждать проблему, которая почему-то таинственным образом решается при помощи BEGIN TRAN.

Надеюсь не обидел.


 
kaif ©   (2008-09-09 13:03) [34]

Ega23 ©   (09.09.08 11:22) [30]
Set NoCount On;
Insert into ... (...) Values (....);
Select Result=Scope_Identity();

Выполнять через TADODataSet.Open;
Брать результат либо через TADODataSet.Fields[0[ либо через обычный FieldByName


Спасибо. Похоже, то решение, что я сразу применил, т.е. вызов хранимой процедуры и получение выходного рекордсета (одной строки и одной колонки) методом Open, не является таким уж нетрадиционным решением проблемы.

Собственно, сейчас меня волнуют только транзакции. Когда я открываю набор, надо полагать, что стартует некоторая транзакция. С ADO я мало работал. С MSSQL через ADO не работал никогда.
Дайте ссылку, если у кого есть, на статью, где описано явное управление транзакциями MSSQL при помощи ADO Delphi.


 
Ega23 ©   (2008-09-09 13:04) [35]


> Похоже, то решение, что я сразу применил, т.е. вызов хранимой
> процедуры и получение выходного рекордсета (одной строки
> и одной колонки) методом Open, не является таким уж нетрадиционным
> решением проблемы.


Ну я ОЧЕНЬ часто именно так и делаю.


 
kaif ©   (2008-09-09 13:27) [36]

2 Ega23 ©   (09.09.08 13:04) [35]
Спасибо. Так работает.
И с "Set NoCount On" и без него.
Кстати, по справке BOL я не могу понять какую область действия имеет эта команда. В пределах транзакции, сессии или как? И нужно ли после такого вызова делать Set NoCount Off? Или достаточно проделать один раз после открытия соединения и забыть об этом? Пользуются ли ADO информацией о количестве затронутых записей и не нарушит ли это все работу в каких-то других местах?


 
Anatoly Podgoretsky ©   (2008-09-09 13:41) [37]

> sniknik  (09.09.2008 11:42:31)  [31]

> можно кстати конкретнее, чем то что написано мешает(дает глюки) в работе?

FixedChar <> NVarChar(WideString) = Char
Дело не в фиксированой длине, а то что теряется Юникод, да и сам FixedChar очень неприятен при использование в dbAware - что бы добавить в конец приходится сначала стереть кучу пробелов.

AutoInc <> Integer, хотя бы потому что он ReadOnly и не только Integer

Это не единственные ошибки с типам в параметрах, про остальные просто не помню, но когда разбирался - то помнил, и это по разному в Д5-2006 - похоже хвост отрубали по кускам.


 
Ega23 ©   (2008-09-09 13:47) [38]


> Кстати, по справке BOL я не могу понять какую область действия
> имеет эта команда. В пределах транзакции, сессии или как?
>  И нужно ли после такого вызова делать Set NoCount Off?
> Или достаточно проделать один раз после открытия соединения
> и забыть об этом? Пользуются ли ADO информацией о количестве
> затронутых записей и не нарушит ли это все работу в каких-
> то других местах?


Set NoCount On;
create table #Tmp(UID int identity (1,1), aValue int)
insert into #Tmp(aValue) Values (1)
insert into #Tmp(aValue) Values (2)
insert into #Tmp(aValue) Values (3)
Select * from #Tmp
drop table #Tmp


Попробуй в QueryAnalyzer выполнить с Set NoCount On и без него.

Потом так попробуй:

Set NoCount On
create table #Tmp(UID int identity (1,1), aValue int)
insert into #Tmp(aValue) Values (1)
insert into #Tmp(aValue) Values (2)
Set NoCount OFF
insert into #Tmp(aValue) Values (3)
Select * from #Tmp
drop table #Tmp


 
Anatoly Podgoretsky ©   (2008-09-09 13:50) [39]

> kaif  (09.09.2008 13:03:34)  [34]

Транзакции!
Их две

1. средствами Дельфи на стороне клиента, это когда транзакция запускается через TAdoConnection

2. транзакция запускается средствами сервера, через управление транзакцией в запросе BEGIN TRAN

Считается, что надежнее и правильнее вариант 2, но я всегда использую 1

По поводу литературы по ADO.VCL особо читать нечего, поскольку это всего лишь обертка над ADO (ActiveX) и вот это и надо читать, только тогда можно понять кухню и даже напрямую работать с АДО с помощью компонент. У Борланда много проблем в реализации обертки и конечно эти проблемы не документированы, можно конечно поискать проблемы в QC но стоит ли, это еще та помойка.

Кстати если нет особых условий, то TAdoCommand не требуется, поскольку запросы можно писать в TAdoConnection, можно даже и SELECT запросы и потом работать с _recordSet или переводить его в Dataset - но это уже лишнии сложности, на которые стоит идти только в особых случаях.


 
Anatoly Podgoretsky ©   (2008-09-09 13:53) [40]

> kaif  (09.09.2008 13:27:36)  [36]

Не разбирался, но кажется в рамках транзакции, если задана в транзакции.
И в рамках сессии если задано на уровне AdoConnection.

Подумай также насчет прямой работе с АДО, но через компоненты, а не интерфейсы, можно получить интерсные результаты.



Страницы: 1 2 3 вся ветка

Форум: "Базы";
Текущий архив: 2009.05.17;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.6 MB
Время: 0.006 c
15-1237325403
Юрий
2009-03-18 00:30
2009.05.17
С днем рождения ! 18 марта 2009 среда


2-1238860311
worldmen
2009-04-04 19:51
2009.05.17
Опять "Неверный дескриптор"


15-1237111075
Немо2
2009-03-15 12:57
2009.05.17
Что бы придумать, что бы не ездить на работу?


15-1236846757
Select
2009-03-12 11:32
2009.05.17
UML-диаграммы


2-1238664318
D@nger
2009-04-02 13:25
2009.05.17
принадлежит ли дата периоду?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский