Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вернуть обшику из ХП(sql запроса) клиенту. работа с БД из дельфи 
V
    Опции темы
FasterHarder
Дата 24.1.2008, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



Всем программистам привет! Respect! В общем есть малая проблемка, как такое реализовать: для простоты, есть форма, на ней edit и кнопка. Когда ввели в edit - имя контраг. нажимаем кнопку, при клике запускается вызов ХП на сервере MS 2000. ХП проверяет на дубликат новое значение и если такого нет делается insert, иначе НУЖНО ВЕРНУТЬ КЛИЕНТУ СООБЩЕНИЕ О ТОМ, что такой контрагент уже есть. Я незнаю как вернуть ошибку клиенту. Подскажите как быть то?
тестовый пример, затем легко переделать в ХП:

Код

declare @i int, @s varchar(30)
set @s = 'Ivanova'
begin tran
select @i = 1 where exists(select nameCustomer from customers where
                nameCustomer = @s)
if @i = 1 
begin
    print 'Такой участник уже существует' 
       // нужно сгенерировать ошибку(может raiseerror), а главное вернуть его клиенту
    rollback tran
end
else
begin
    insert into customers(nameCustomer) values(@s)  
    print 'Вставка прошла успешно'
    commit tran
end



PM MAIL   Вверх
Deniz
Дата 24.1.2008, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Код

declare @ret_code int, @err_message varchar(1000)
...
if @i = 1 
begin
  set @ret_code = -1
  set @err_message = 'текст об ошибке'
  ...
end
else
begin
  insert ...
  set @ret_code = @@IDENTITY
  set @err_message = ''
  ...
end
select @ret_code, @err_message

На клиенте exec <нужная процедура> <параметры>
проверяй ответ, @ret_code = 
> 0 - ошибок нет, id добавленной записи
< 0 - ошибка, текст в @err_message


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
FasterHarder
Дата 24.1.2008, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



Спасибо Deniz, я сделал в итоге на клиенте все, на будущее учту ваш вариант  smile :
Код

procedure Tfrm_main.btn_addCustomClick(Sender: TObject);
var
    newCustom : string;
    b : boolean;
begin
    newCustom := trim(frm_main.Edit1.Text);
    if(length(newCustom) = 0) then
    begin
        messagedlg('Название заказчика не может быть пустым. Введите имя заказчика!', mtInformation, [mbOk], 0);
        frm_main.Edit1.SetFocus;
    end
    else
    begin
        b := frm_main.sql_tblCustom.Locate('nameCustomer', newCustom, [loCaseInsensitive]);
        if(b) then
        begin
            messageDlg('Заказчик с таким именем уже существует. Введите имя заказчика!', mtInformation, [mbOk], 0);
            frm_main.Edit1.SetFocus;
        end
        else
        begin
            frm_main.sql_tblCustom.Append;
            frm_main.sql_tblCustom.FieldByName('nameCustomer').AsString := newCustom;
            frm_main.sql_tblCustom.Post;
            messageDlg('Запись о заказчике успешно добавлена!', mtInformation, [mbOk], 0);
        end;
    end;
end;

PM MAIL   Вверх
Deniz
Дата 25.1.2008, 07:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



FasterHarder, не совсем корректный код, добавь:
Код

 ...
        frm_main.sql_tblCustom.Close; // эти 2 строчки нужны для забора новых данных с сервера,
        frm_main.sql_tblCustom.Open; //  может кто-то такую запись уже добавил ;-)
        // или сделать запрос на проверку в отдельной транзакции 

        b := frm_main.sql_tblCustom.Locate('nameCustomer', newCustom, [loCaseInsensitive]);
...

А вообще: 
Делаешь уникальный индекс по полю.
Добавляешь без проверки.
Ловишь и обрабатываешь исключение.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
FasterHarder
Дата 25.1.2008, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



Deniz
А вообще: 
Делаешь уникальный индекс по полю.
Добавляешь без проверки.
Ловишь и обрабатываешь исключение. 

это про клиента разговор или про сервер?

А что касается:
Код

 frm_main.sql_tblCustom.Close; // эти 2 строчки нужны для забора новых данных с сервера,
        frm_main.sql_tblCustom.Open; //  может кто-то такую запись уже добавил ;-)
        // или сделать запрос на проверку в отдельной транзакции 

        b := frm_main.sql_tblCustom.Locate('nameCustomer', newCustom, [loCaseInsensitive]);

то режим работы с БД будет однопользовательский. Я прекрасно понимаю что добавляется огромная куча гемора если разрабатывать под multi - user, я даже 5% незнаю свойств и методов, которые при этом нужно будет затрагивать. Эх, ламер я все таки.  smile 
PM MAIL   Вверх
Deniz
Дата 28.1.2008, 06:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Цитата(FasterHarder @  25.1.2008,  16:10 Найти цитируемый пост)
это про клиента разговор или про сервер?
Индекс на сервере, а все остальное на клиенте.
Уникальный индекс не даст добавить 2 одинаковых значения, а в проверке есть потенциальная дырка. 
Пример:
Код

Транзакция 1 старт
Транзакция 2 старт
Транзакция 1 проверка
Транзакция 2 проверка
Транзакция 1 добавление
Транзакция 2 добавление
Транзакция 1 коммит
Транзакция 2 коммит
в данной ситуации могут появиться 2 одинаковых значения, причем чем больше пользователей, тем больше вероятность.

Цитата(FasterHarder @  25.1.2008,  16:10 Найти цитируемый пост)
то режим работы с БД будет однопользовательский
нужно всегда закладывать работу с несколькими пользователями.
Программы очень редко остаются однопользовательскими, и когда наступает час Х, перевод функциональность на несколько пользователей становится кошмаром.
Цитата(FasterHarder @  25.1.2008,  16:10 Найти цитируемый пост)
Я прекрасно понимаю что добавляется огромная куча гемора если разрабатывать под multi - user, я даже 5% незнаю свойств и методов, которые при этом нужно будет затрагивать.
ну куча не сильно большая, иногда достаточно некоторых знаний по СУБД и интуиции.

Все это ИМХО, и не стоит рассматривать как правду в последней инстанции  smile 



--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0750 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.