Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Delphi


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 238
от 14.09.2005, 22:00

Администратор:Калашников О.А.
В рассылке:Подписчиков: 244, Экспертов: 53
В номере:Вопросов: 3, Ответов: 11


Вопрос № 26107: Господа эксперты, оч. прошу выслать кусочек кода приложения, где используются компоненты IBX, в первую очередь меня интересует ручной старт и commit/rollback транзакций, какие параметры проверять перед стартом, что делать после commit и т.д. лучш...
Вопрос № 26108: Господа эксперты, оч. прошу выслать кусочек кода приложения, где используются компоненты IBX, в первую очередь меня интересует ручной старт и commit/rollback транзакций, какие параметры проверять перед стартом, что делать после commit и т.д. лучш...
Вопрос № 26113: Здравствуйте эксперты. В мануале, по которому я изучаю дельфи написано, что при попытке открытия текстового файла в режмие добавления, если, открываемый файл не существует, то выйдет ошибка времени выполнения программы. И чтобы этого н...

Вопрос № 26.107
Господа эксперты, оч. прошу выслать кусочек кода приложения, где используются компоненты IBX, в первую очередь меня интересует ручной старт и commit/rollback транзакций, какие параметры проверять перед стартом, что делать после commit и т.д.
лучше если код будет для C++Builder, но это не столь важно, а так же неплохо бы комментарии к примерам :)
всех оч. благодарю
если это важно, то я пишу в C++Builder 6. база FireBird1.5.2, доступ через IBX, для отображения DBGridEh+IBDataSet с автостарт транзакциями, а для добавления/изменения данных - отдельную форму на которой простые эдиты и комбобоксы, значения которых передаю в IBStoredProc, а вот они (StoredProc) уже висят на транзакции с ручным стартом/commit\'ом. То появляется соообщение Transaction is active, то Transaction is not active, или приложение делает abnormal termination
Отправлен: 09.09.2005, 17:31
Вопрос задал: Степанюк Александр (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Zubex
Здравствуйте, Степанюк Александр!

Вы перед запуском процедуры проверяйте
if not IBStoredProc.transaction.active then IBStoredProc.transaction.StartTransaction
или наоборот
if IBStoredProc.transaction.active then IBStoredProc.transaction.Commit

Удачи!!!
Ответ отправил: Zubex (статус: 3-ий класс)
Отправлен: 09.09.2005, 17:42

Отвечает: sir henry
Здравствуйте, Степанюк Александр!
Начало и конец транзакций Вам нужно делать ВНУТРИ StoredProc, т.е. пользоваться командами FireBird. Поэтому неважно что Вы пишите в Билдере. :)
Транзакции должны быть максимально короткими, т.к. на время транзакций могут блокироваться записи и таблицы, и другие пользователи будут в полном унынии ковырять в носу, дожидаясь их разблокировки.
Общий синтаксис такой:
CREATE PROCEDURE Update_MyTable(id_Name INTEGER, First_Name VARCHAR(20), Last_Name VARCHAR(20))
BEGIN
START TRANSACTION {Запускается транзакция}
UPDATE Names
SET fn=First_Name, ln=Last_Name
WHERE id=idName
COMMIT {Транзакция подтверждается}
END
На время апдейта записи попадающие под указаные условия (WHERE) блокируются. Разблокируются он только тогда, когда поступает команда COMMIT или ROLLBACK.
Пример этот искусственный, т.к. на время апдейта транзакция запускается автоматически и завершается после выполнения метода Post (если Вы его используете). Если у Вас стоит автостарт транзакций, то явное употребление транзакций, скорее всего, ненужно.
Неявные транзакции начинаются после запуска методов:
Insert, Edit, Delete, Append и т.п.
Подтверждается транзакция методом Post, а отменяется - методом Cancel.
По транзакциям (применительно к InterBase/Firbird) довольно много и толково написано на сайте www.ibase.ru.
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 10.09.2005, 09:25

Отвечает: Татьяна
Здравствуйте, Степанюк Александр!
Пришлю вам соединение c базой данных. Если будет необходимо, вы можете написать мне на ptv_onu@rambler.ru и я вышлю вам все исходники приложения, где использовался именно Firebird, возможно вы найдете что-нибудь необходимое.
Что касается проверки параметров, я думаю самым простым будет просто перехват исключений во время выполнения транзакции. Целостость данных хорошая БД проверит сама и сама сделает откат.
Commit/Rollback необходим например для вставки записи, т.е. вначале заполняются все поля новой записи и только потом выполняется Post (см. приложение) - фактически выполнение транзакции.

Приложение:

---------
Нет ничего невозможного!!!

Ответ отправила: Татьяна (статус: 1-ый класс)
Отправлен: 11.09.2005, 18:08
Оценка за ответ: 4
Комментарий оценки:
Ну я же просил про ручной старт commit/rollback транзакции и параметры ТРАНЗАКЦИИ


Вопрос № 26.108
Господа эксперты, оч. прошу выслать кусочек кода приложения, где используются компоненты IBX, в первую очередь меня интересует ручной старт и commit/rollback транзакций, какие параметры проверять перед стартом, что делать после commit и т.д.
лучше если код будет для C++Builder, но это не столь важно, а так же неплохо бы комментарии к примерам :)
всех оч. благодарю
если это важно, то я пишу в C++Builder 6. база FireBird1.5.2, доступ через IBX, для отображения DBGridEh+IBDataSet с автостарт транзакциями, а для добавления/изменения данных - отдельную форму на которой простые эдиты и комбобоксы, значения которых передаю в IBStoredProc, а вот они (StoredProc) уже висят на транзакции с ручным стартом/commit'ом. То появляется соообщение Transaction is active, то Transaction is not active, или приложение делает abnormal termination
Отправлен: 09.09.2005, 17:32
Вопрос задал: Степанюк Александр (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: sir henry
Здравствуйте, Степанюк Александр!
Зачем Вы два одинаковых вопроса задаете?
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 10.09.2005, 09:26
Оценка за ответ: 4
Комментарий оценки:
а я один задал в Делфи, а потом его же в ДБ и Делфи :)


Вопрос № 26.113
Здравствуйте эксперты.
В мануале, по которому я изучаю дельфи написано, что при попытке
открытия текстового файла в режмие добавления, если, открываемый
файл не существует, то выйдет ошибка времени выполнения программы. И чтобы этого не случилось нужно вставить следующий код:
AssignFile(f,filename);
{$I-}
Append(f) // открыть для добавления
{$I+}
if IOResult <> 0 // ошибка открытия
then Rewrite(f); // открыть для записи
У меня на Delphi 8 при открытии текстового файла в режиме добавления,если он не существует, программа просто его создает (и без
вышеприведенного кода).
Пожалуйста разъясните ситуацию.
Отправлен: 09.09.2005, 20:43
Вопрос задал: Teapot (статус: Посетитель)
Всего ответов: 7
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: X
Здравствуйте, Teapot!
Вероятно это из-за используемой версии Delphi или из-за технологии NET, используемой в Delphi 8. У меня в Delphi 6 файл так просто не создаёться.
Ответ отправил: X (статус: 8-ой класс)
Отправлен: 09.09.2005, 20:52

Отвечает: Ujin Antikvar
Здравствуйте, Teapot!
Все правильно ведь создает файл ReWrite(f).
А выше приведенный вами код можно разъяснить так.

Связываем файловую переменную с файлом filename
Дальше пытаемся открыть файл
И если произошла ошибка при открытии или файла не сушествует с таким именем
То программа создает его rewrite(f)

Не знаю как сказано ввашей книге по которой вы учитесь.
Но я прежде чем открывать файл и делать в нем изменения или добавления информации, проверяю его наличие, а потом его открываю.
Проверить существует ли файл можно такой функцией FileExists(filname) если файл существует то программа получит True, ну а если файла не существует программа получит False.

Так что удачи!!!
---------
Не зацикливайся на достигнутом, а двигайся в перед
Ответ отправил: Ujin Antikvar (статус: 1-ый класс)
Отправлен: 09.09.2005, 21:22

Отвечает: Denisss
Здравствуйте, Teapot!
Изучите модуль System.pas.
В Delphi 7 я пришел к выводу, что при открытии файла методом Rewrite, устанавливается флаг CREATE_ALWAYS, а при открытии методом Append такой флаг не устанавливается. Вполне возможно, что в Delphi 8 решили устанавливать этот флаг в методе Append.

Кроме того, я слышал, что они вообще переделали все функции доступа к файлам таким образом, чтобы они соответствовали технологии .NET.
Ответ отправил: Denisss (статус: Практикант)
Отправлен: 09.09.2005, 21:31

Отвечает: sir henry
Здравствуйте, Teapot!
Да? А у меня выдает ошибку - File not Found. Может быть Ваш файл уже всетаки существует? :)
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 10.09.2005, 09:48

Отвечает: Romodos
Здравствуйте, Teapot!
Не знаю, в дельфе седьмой он ничего не создаёт и по идее не должен
Видимо это особенность восьмой версии, хотя это очень странно.

---------
FAQ me off!
Ответ отправил: Romodos (статус: 6-ой класс)
Отправлен: 10.09.2005, 17:51

Отвечает: Delphin
Здравствуйте, Teapot!
Delphin 8 - Это для платформы .net. Возможно так оно и есть :-))

---------
Обращаться в ICQ: 77778851 или E-Mail: delphinster@gmail.com
Ответ отправил: Delphin (статус: 10-ый класс)
Отправлен: 10.09.2005, 18:42

Отвечает: Татьяна
Здравствуйте, Teapot!
Возможно вы читали об ошибке выполнения, где использовались другие фунции открытия и добавления файла. Дело в том, что вы используете функции классического Паскаля, которые многие источники уже считают даже устаревшими.
Ошибка есть, но она перехватывается и создание файла происходит путем Rewrite.
Если вам нужно проверять наличие файла, используйте функцию FileExists, а также вместо append и rewrite советую вам использовать функции типа FileCreate, FileWrite, FileClose.... Достаточно содержательную информацию вы найдете в обычной справке Дельфи. Желаю удачи
---------
Нет ничего невозможного!!!
Ответ отправила: Татьяна (статус: 1-ый класс)
Отправлен: 11.09.2005, 18:19


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

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


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Яндекс


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphiplus
Отписаться
Вспомнить пароль

В избранное