powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Несколько вопросов по C++Builder6 и про работу ADO
13 сообщений из 13, страница 1 из 1
Несколько вопросов по C++Builder6 и про работу ADO
    #34948599
qwantor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток!

1. Есть базка на MSSQL 2005. Там есть всякие разные сторки и т.д. они точно работают.
2. Нужно написать программку именно в С++Builder6.

Что есть:
Есть экземпляр TADOConnection, TStoredProc(ADOStoredProc1), TDataSource, TDBGrid.
Если сторке в процессе выполнения программы сказать isActive=true, то всё отлично выполняется.
Но для этого не требуется ни открыть соединение ничего, соответственно соединение открывается само.
Вопросы:
1. На каком этапе оно закрывается? И закрывается ли?


Не делая IsActive=true данные отобразить не удалось.
2. Можно ли это как-то сделать, т.к. мне интересно было бы выполнить несколько хранимых процедур в рамках одной транзакции, и для этого мне нужно открыть отдельное соединение и его ручками закрыть.
3. Возможно ли у строки в гриде как-то задать ID, который будет первичным ключом из выборки, полученной хранимыми процедурам?
4. Как просмотреть все поля возвращаемые сторкой, пробежаться по строкам, по столбцам, не отображая их в гриде?

Вот такие 4 вопроса.
Всем заранее спасибо!!!
...
Рейтинг: 0 / 0
Несколько вопросов по C++Builder6 и про работу ADO
    #34949483
Фотография Tshamіl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwantorДоброго времени суток!

1. Есть базка на MSSQL 2005. Там есть всякие разные сторки и т.д. они точно работают.
2. Нужно написать программку именно в С++Builder6.

Что есть:
Есть экземпляр TADOConnection, TStoredProc(ADOStoredProc1), TDataSource, TDBGrid.
Если сторке в процессе выполнения программы сказать isActive=true, то всё отлично выполняется.
Но для этого не требуется ни открыть соединение ничего, соответственно соединение открывается само.
Вопросы:
1. На каком этапе оно закрывается? И закрывается ли?


Не делая IsActive=true данные отобразить не удалось.
2. Можно ли это как-то сделать, т.к. мне интересно было бы выполнить несколько хранимых процедур в рамках одной транзакции, и для этого мне нужно открыть отдельное соединение и его ручками закрыть.
3. Возможно ли у строки в гриде как-то задать ID, который будет первичным ключом из выборки, полученной хранимыми процедурам?
4. Как просмотреть все поля возвращаемые сторкой, пробежаться по строкам, по столбцам, не отображая их в гриде?

Вот такие 4 вопроса.
Всем заранее спасибо!!!
1.
Код: plaintext
ADOConnection1->Connected=false;
2. Что значить выполнить несколько процедур в рамках одной транзакции? В MSSQL для каждой процедуры создается отдельная транзакция, если подробно то при входе в процедуру, грубо говоря, идет команда begin tran в конце процедуры выполняется команда comit tran или rolback tran в зависимости от того коректно отработала процедура или нет. Поэтому вопрос "Как выполнить процедуры в рамках одной транзакции" немного некоректен.
3. Опять же некоректный вопрос, как можно задать первичный ключь в гриде? Грид это всего лишь компонент который отображает данные. Для чего тебе это нужно, именно в приложении, объясни?!
4. Чем пробижатся? Вообще ничего не понял?

такое впечатление, что у тебя были попытки поработать с ADO.NET, но ты их оставил и вернулся к старому доброму ADO:)
...
Рейтинг: 0 / 0
Несколько вопросов по C++Builder6 и про работу ADO
    #34950195
qwantor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tshamіl
2. Что значить выполнить несколько процедур в рамках одной транзакции? В MSSQL для каждой процедуры создается отдельная транзакция, если подробно то при входе в процедуру, грубо говоря, идет команда begin tran в конце процедуры выполняется команда comit tran или rolback tran в зависимости от того коректно отработала процедура или нет. Поэтому вопрос "Как выполнить процедуры в рамках одной транзакции" немного некоректен.


Спасибо, незнал))

Tshamіl
Опять же некоректный вопрос, как можно задать первичный ключь в гриде? Грид это всего лишь компонент который отображает данные. Для чего тебе это нужно, именно в приложении, объясни?!


У меня первичный ключ GUID, который я нехочу отображать в гриде, но хотел бы, что бы по строке в гриде можно было бы узнать ключ из нужной мне таблицы в БД, который передаётся в сторке.

Tshamіl
4. Чем пробижатся? Вообще ничего не понял?

такое впечатление, что у тебя были попытки поработать с ADO.NET, но ты их оставил и вернулся к старому доброму ADO:)


Почти в точку!!!)))
Я работю с ADO.NET, и видимо им очень избалован)), но никогда не работал с ADO.

В приложении мне нужно, напирмер, по ID пользователя узнать все его роли или есть ли у него некая роль, и соответсвенно мне совершенно не нужно их отображать, а нужно, как в ADO.NET пробидаться по коллекции DataRow в DataTable, или Select к DataTable сделать, потом сохранить куда-нибудь нужные записи. Вот как-то так.

Что касается грида, то там должно быть как-то так:
пользователь навододит мышкой, или щёлкает на строку в гриде, по этой строке определяется GUID строки в таблице, по этому GUID-y отображаются в другом гриде какие-то другие данные.
Т.е. естественно не у строки грида первичный ключ, а где-то хранить ассоциацию строку и GUID из таблицы БД, было бы удобно, если бы это как-то можно было хранить в самом гриде.
Есть ли такая возможность?
...
Рейтинг: 0 / 0
Несколько вопросов по C++Builder6 и про работу ADO
    #34950397
Фотография Tshamіl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwantor

Почти в точку!!!)))
Я работю с ADO.NET, и видимо им очень избалован)), но никогда не работал с ADO.

В приложении мне нужно, напирмер, по ID пользователя узнать все его роли или есть ли у него некая роль, и соответсвенно мне совершенно не нужно их отображать, а нужно, как в ADO.NET пробидаться по коллекции DataRow в DataTable, или Select к DataTable сделать, потом сохранить куда-нибудь нужные записи. Вот как-то так.

Что касается грида, то там должно быть как-то так:
пользователь навододит мышкой, или щёлкает на строку в гриде, по этой строке определяется GUID строки в таблице, по этому GUID-y отображаются в другом гриде какие-то другие данные.
Т.е. естественно не у строки грида первичный ключ, а где-то хранить ассоциацию строку и GUID из таблицы БД, было бы удобно, если бы это как-то можно было хранить в самом гриде.
Есть ли такая возможность?
Сразу хочу сказать что ADO.NET концептуально отличается от ADO, в ADO работа идет напрямую с данными, поэтому сохранять нужные изменения можно лишь в самой бд. Вся логика должна быть реализована на сервере. Если я правильно понял то алгоритм решения твоей проблемы должен быть примерно таким:
1. Загрузить в грид всех пользователей.
2. В зависимости от выбранного пользователя сформировать запрос к серверу и получить все его роли.(сдесь я не уверен, что это именно то что тебе нужно)
Если чесно с трудом понимаю твою задачу. непонятно для чего находить роли, а затем не отображая их сохранять?

вообще я советовал бы прочесть вот эту статю http://www.sql.ru/articles/mssql/2005/122703ADO.shtml
там конечно все написано на примерах с использованием Delphi, но разницы нет никакой т.к. компоненты всеравно теже.
...
Рейтинг: 0 / 0
Несколько вопросов по C++Builder6 и про работу ADO
    #34950436
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwantor
2. Можно ли это как-то сделать, т.к. мне интересно было бы выполнить несколько хранимых процедур в рамках одной транзакции, и для этого мне нужно открыть отдельное соединение и его ручками закрыть.

Может быть имелось ввиду вот это?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
На сервак можно кинуть и такой код...
BEGIN
 Exec Proc1
 Exec Proc2
 ....
 Exec proc10 
END

Вообще в блоке:
BEGIN
Можно поместить код TSQL и отправлять на сервак.
END

Удачи.
...
Рейтинг: 0 / 0
Несколько вопросов по C++Builder6 и про работу ADO
    #34950477
Фотография Дикий Билл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tshamіl
2. Что значить выполнить несколько процедур в рамках одной транзакции? В MSSQL для каждой процедуры создается отдельная транзакция, если подробно то при входе в процедуру, грубо говоря, идет команда begin tran в конце процедуры выполняется команда comit tran или rolback tran в зависимости от того коректно отработала процедура или нет.Неправда.
По умолчанию каждая команда считается отдельной транзакцией. команды в процедуре тоже.
Процедура не имеет никакой атомарности, если там нет begin tran ... commit
...
Рейтинг: 0 / 0
Несколько вопросов по C++Builder6 и про работу ADO
    #34950925
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwantor
Что касается грида, то там должно быть как-то так:
пользователь навододит мышкой, или щёлкает на строку в гриде, по этой строке определяется GUID строки в таблице, по этому GUID-y отображаются в другом гриде какие-то другие данные.
Т.е. естественно не у строки грида первичный ключ, а где-то хранить ассоциацию строку и GUID из таблицы БД, было бы удобно, если бы это как-то можно было хранить в самом гриде.
Есть ли такая возможность?Этот момент хорошо разруливается с помощью связанных датасетов, т.е. у подчинённого датасоурса выставляешь свойство MasterSource к родительскому датасету - и вуаля! ничё не надо сохранять, всё работает само
...
Рейтинг: 0 / 0
Несколько вопросов по C++Builder6 и про работу ADO
    #34962829
smskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwantor
2. Можно ли это как-то сделать, т.к. мне интересно было бы выполнить несколько хранимых процедур в рамках одной транзакции, и для этого мне нужно открыть отдельное соединение и его ручками закрыть.

Да можно.
По умолчанию ADO работает с процедурами и SQL коммандами в режиме autocommit. Чтобы выполнить несколько комманд или процедур в рамках одной транзакции надо явно начать транзакцию.
Делается это с помощью TADOConnection.BeginTrans, завершение - TADOConnection.CommitTrans, откат TADOConnection.RollbackTrans.
То есть что-то типо того:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
try {
  Conn->BeginTrans();
  Proc1->ExecProc();
  Proc2->ExecProc();
  Conn->CommitTrans();
}
catch(Exception &exception) {
  Conn->RollbackTrans();
}
...
Рейтинг: 0 / 0
Несколько вопросов по C++Builder6 и про работу ADO
    #34962858
smskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TshamіlЧто значить выполнить несколько процедур в рамках одной транзакции? В MSSQL для каждой процедуры создается отдельная транзакция, если подробно то при входе в процедуру, грубо говоря, идет команда begin tran в конце процедуры выполняется команда comit tran или rolback tran в зависимости от того коректно отработала процедура или нет.
Полная чушь.

P.S.: В моем предыдущем примере вызов Conn->BeginTrans() должен быть перед try, чтобы если в нем возникла ошибка не вызвался RollbackTrans() при неначатой транзакции
...
Рейтинг: 0 / 0
Несколько вопросов по C++Builder6 и про работу ADO
    #34963608
Фотография Tshamіl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дикий Билл Tshamіl
2. Что значить выполнить несколько процедур в рамках одной транзакции? В MSSQL для каждой процедуры создается отдельная транзакция, если подробно то при входе в процедуру, грубо говоря, идет команда begin tran в конце процедуры выполняется команда comit tran или rolback tran в зависимости от того коректно отработала процедура или нет.Неправда.
По умолчанию каждая команда считается отдельной транзакцией. команды в процедуре тоже.
Процедура не имеет никакой атомарности, если там нет begin tran ... commit
Я неправильно выразился, то что я написал, в посте, верно лишь для процедур в которых используется одна команда.
...
Рейтинг: 0 / 0
Несколько вопросов по C++Builder6 и про работу ADO
    #34963612
Фотография Tshamіl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smskin TshamіlЧто значить выполнить несколько процедур в рамках одной транзакции? В MSSQL для каждой процедуры создается отдельная транзакция, если подробно то при входе в процедуру, грубо говоря, идет команда begin tran в конце процедуры выполняется команда comit tran или rolback tran в зависимости от того коректно отработала процедура или нет.
Полная чушь.

P.S.: В моем предыдущем примере вызов Conn->BeginTrans() должен быть перед try, чтобы если в нем возникла ошибка не вызвался RollbackTrans() при неначатой транзакции
Ты уверен, что, если у тебя во второй процедуре произойдет ошибка, то все действия которые выполнила первая процедура будут отменены?
...
Рейтинг: 0 / 0
Несколько вопросов по C++Builder6 и про работу ADO
    #34963628
smskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TshamіlТы уверен, что, если у тебя во второй процедуре произойдет ошибка, то все действия которые выполнила первая процедура будут отменены?
Да. Проверено опытом. Да и вобще, логически, какой смысл в транзакциях, если процедуры в них не участвуют? Если у них какие-то свои отдельные транзакции?
...
Рейтинг: 0 / 0
Несколько вопросов по C++Builder6 и про работу ADO
    #34963755
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smskin
В моем предыдущем примере вызов Conn->BeginTrans() должен быть перед try, чтобы если в нем возникла ошибка не вызвался RollbackTrans() при неначатой транзакции

см. TADOConnection::InTransaction
Код: plaintext
1.
2.
3.
4.
....
if(Conn->InTransaction)
   Conn->RollbackTrans();
....
_________________
"Helo, word!" - 17 errors 56 warnings
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Несколько вопросов по C++Builder6 и про работу ADO
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]