powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Взаимодействие клиентов с БД.
25 сообщений из 323, страница 6 из 13
Взаимодействие клиентов с БД.
    #39962331
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
На самом деле таких многовековых залежей говнокода, как в энтерпрайзе нет больше, наверное, нигде.

По моей практике, самые залежи говнокода в интеграторах (ну, вернее у клиентов интеграторов), в первую очередь в госструктурах и на внедрениях всяких САПов. Энтерпрайз по крайней мере пишет для себя, и в нём работают люди, которые будут много лет поддерживать и развивать именно то, что написали. А в интеграторах подход откатил - сдал - ушёл - забыл, заинтересованность в качестве решения отрицательная.
...
Рейтинг: 0 / 0
Взаимодействие клиентов с БД.
    #39962334
Misha_E
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Misha_E
в том числе и код web страницы....

Это образец эталонной архитектуры?

Что ж тут тролли то все какие слабенькие?
Это образец (в понимании одного из вендоров) того как оно называется - Application Express.
Надеюсь перевод не нужен.При чем судя по гуглу , многим этого в "освободите от вендор лока"(пострессе) не хватет
и люди ставят Oracle XE и из него DBLINK. Чудны дети твои,Боженька...
...
Рейтинг: 0 / 0
Взаимодействие клиентов с БД.
    #39962336
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, про APEX я пожалуй соглашусь, что это попытка посадить на vendor lock. Ровно как и предыдущее подёргивание в этом направлении - Oracle Forms - оно не для того, чтобы удобно и хорошо разрабатывать приложения, а для того, чтобы дебилы, которые умеют только PL/SQL, всю жизнь только на нём и оставались - с соответствующим влиянием на рынок рабочей силы и, соответственно, рынок платформ.
...
Рейтинг: 0 / 0
Взаимодействие клиентов с БД.
    #39962339
Misha_E
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Кстати, про APEX я пожалуй соглашусь, что это попытка посадить на vendor lock. Ровно как и предыдущее подёргивание в этом направлении - Oracle Forms - оно не для того, чтобы удобно и хорошо разрабатывать приложения, а для того, чтобы дебилы, которые умеют только PL/SQL, всю жизнь только на нём и оставались - с соответствующим влиянием на рынок рабочей силы и, соответственно, рынок платформ.

Ага и существовал он до Ноды,Джанги и других. Тогда еще лочить не от кого было , тока если от мелкософта.
...
Рейтинг: 0 / 0
Взаимодействие клиентов с БД.
    #39962357
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Dimitry Sibiryakov, сегодня, 14:14 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1325462&msg=22139758][22139758]
>И Вы не знаете про существование UPDATE...RETURNING.
<
Где?
Здесь нет.
И что сиё даёт?
...
Рейтинг: 0 / 0
Взаимодействие клиентов с БД.
    #39962358
Misha_E
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев
>Dimitry Sibiryakov, сегодня, 14:14 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1325462&msg=22139758][22139758]
>И Вы не знаете про существование UPDATE...RETURNING.
<
Где?
Здесь нет.
И что сиё даёт?

Предположу что человек имел ввиду это -
http://firebirdsql.su/doku.php?id=returning
...
Рейтинг: 0 / 0
Взаимодействие клиентов с БД.
    #39962365
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha_E
и люди ставят Oracle XE

Я хорошо помню времена, когда MS SharePoint по энтерпрайзам разлетался, как пирожки в голодный год. А сказать почему? МС платила партнерам бешенный по сравнению с другими продуктами процент за его впаривания своим клиентам. А у меня после работы тогда с ним до сих пор от одного упомминания приступы тахикардии начинаются. Я тогда случайно пообщался с одним человеком из МС, который одно время участвовал в его разработке и он мне рассказывал, что этим (его разработкой) регулярно занималась куча случайных людей, т.е. если в МС какое-то время какого-нибудь девелопера было нечем занять, то его по-дефолту отправляли в команду шейрпойнта
...
Рейтинг: 0 / 0
Взаимодействие клиентов с БД.
    #39962378
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев
>hVostt, сегодня, 12:32 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1325462&msg=22139641][22139641]
>Это и без ХП реализуется. В общем, как обычно, вы просто не умеете работать с БД.
<
Покажите как надо. Приведите код пожалуйста.
Но по моему мнению, пользователь должен точно знать, что он меняет. Поэтому Ваш код для меня не приемлен.


Вы меня совершенно не слышите, или не хотите услышать, или (что печально) не способны воспринимать информацию

Возьмём ещё раз мой пример, в котором ничего не меняется с точки зрения клиента:

Код: c#
1.
2.
3.
var department = repository.Get<Department>(id);
department.Name = "Новое имя отдела";
repository.Save(department);



В репозиторий можно добавить поддержку оптимистичной блокировки:

Этот код выполнит следующие запросы:

Код: sql
1.
2.
3.
select Id, Revision, Name from Departments where Id = @id;

update Departments set Name = @name where Id = @id and Revision = @revision;



Теперь, репозиторий выбросит специальное исключение, если не удалось обновить запись из-за нарушения номер ревизии (под которым можно сохранять инкремент изменений, или штамп времени).

Вот так можно ловить исключение:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
var department = repository.Get<Department>(id);
department.Name = "Новое имя отдела";
try {
   repository.Save(department);
}
catch (OptimisticLockException ex)
{
   Console.WriteLine("Сорян бро, запись была уже кем-то изменена");
}



Очень упрощённый пример метода Save репозитория:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
class Repository
{
   ....

   public void Save<TEntity>(TEntity entity)
     where TEntity: EntityBase
   {
       var sqlText = _sqlGenerator.EntityUpdate<TEntity>();
      // для сущности Department sqlText будет содержать примерно такой SQL
      //    update Department set Name = @name where Id = @id and Revision = @revision
      var count = _connection.Execute(sqlText, entity);
      if(count == 0) 
        throw new OptimisticLockException("Сущность {0} с Id = {1} уже кем-то изменена", typeof(TEntity).Name, entity.Id);
   }

   ...
}
...
Рейтинг: 0 / 0
Взаимодействие клиентов с БД.
    #39962380
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,

А теперь, когда я уже вам кода тут понаписал.

Может вы соизволите наконец объяснить, зачем вам ХП?
...
Рейтинг: 0 / 0
Взаимодействие клиентов с БД.
    #39962403
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев

Дополню по этой части, чтоб вопросов небыло, а то я всё пытаюсь на концептуальном уровне разговаривать, но с вами не получается:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
class Repository
{
   ....

   public void Save<TEntity>(TEntity entity)
     where TEntity: EntityBase
   {
       var sqlText = _sqlGenerator.EntityUpdate<TEntity>();
      // для сущности Department sqlText будет содержать примерно такой SQL
      //    update Department set Name = @name and Revision = @revision where Id = @id and Revision = @currentRevision
      var currentRevision = entity.Revision;
      entity.Revision += 1;
      var parameters = new DynamicParameters(entity);
      parameters["currentRevision"] = currentRevision;
      var count = _connection.Execute(sqlText, parameters);
      if(count == 0) 
        throw new OptimisticLockException("Сущность {0} с Id = {1} уже кем-то изменена", typeof(TEntity).Name, entity.Id);
   }

   ...
}
...
Рейтинг: 0 / 0
Взаимодействие клиентов с БД.
    #39962417
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>hVostt, сегодня, 17:45 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1325462&msg=22139917][22139917]
>...Может вы соизволите наконец объяснить, зачем вам ХП?
<
Мне нужно текущее состояние сущности после операций изменения для представления клиенту.
Клиент работает со списком сущностей в гриде. Корректирует нужную и выполняет UPDATE. В результате отображаемое состояние сущности может не изменится (в случае ок) или изменится на текущее её состояние в базе + отображение состояние не штатной ситуации.
Привожу пример фрагмента кода приложения. Он одинаков и для MS SQL и PostgreSQL.
Код есть шаблон для всех подобных операций с сущностями.
wsp - класс, отвечающий за работу с базой данных. Для MS SQL свой, для PostgreSQL - свой.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
    //-- UPDATE 
    //-- Обработка нажатия кнопки сохранения изменений записи в базу данных
    //=========================================================================
    private void btc_Сохранить_Click(object sender, RoutedEventArgs e) {
      try {
        wspErr = null; if (!bl_Разрешение) return; bl_Разрешение = false;  //-- Запрещаем пользовательский интерфейс
        if (dgv_Entity.SelectedIndex == -1) return;  //-- Нет выбора
        //-- Получим индекс элемента коллекции
        xrow = (row_Entity)dgv_Entity.SelectedItem; iRow = oc_Entity.IndexOf(xrow);

        //-- выполнение хранимой процедуры
        wsp.sp_Параметры(3);
        wsp.sp_Параметр("pk_Entity", xrow.pk_Entity); wsp.sp_Параметр_ts("ts_Entity", xrow.ts_Entity);
        wsp.sp_Параметр("str_Отдел", xrow.str_Отдел);
        xrow = null; lst_Entity = null;
        wsp.Entity_SP("au_Отделы_upd", wsp.sp_Upd, RowToEntity); if ((wspErr = wsp.wspErr) != null) return;
        if (xrow == null) { wspErr = "Ошибка выполнения операции"; return; }

        dgv_Entity.CancelEdit(); xrow.chb_Entity = false;
        oc_Entity.RemoveAt(iRow); oc_Entity.Insert(iRow, xrow); dgv_Entity.SelectedIndex = iRow;
      }
      catch (Exception ex) { wspErr = ex.Message; }
      finally {
        bl_Разрешение = true;      //-- Разрешаем пользовательский интерфейс
        if (wspErr != null) { MessageBox.Show(wspErr, caption_Entity, MessageBoxButton.OK); }
      }
    }
...
Рейтинг: 0 / 0
Взаимодействие клиентов с БД.
    #39962433
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев

btc_ Сохранить _Click

"Ой, всё" (с)
...
Рейтинг: 0 / 0
Взаимодействие клиентов с БД.
    #39962437
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев
Мне нужно текущее состояние сущности после операций изменения для представления клиенту.


Нет не нужно. У вас оптимистичная блокировка.


ВМоисеев
Привожу пример фрагмента кода приложения. Он одинаков и для MS SQL и PostgreSQL.
Код есть шаблон для всех подобных операций с сущностями.


Ну и посмотрите на свой код внимательно. Кроме этого кода, у вас ещё есть код в БД в виде ХП.
По сути у вас очень много дублирующегося мусора.
Это, извините, говнокод (даже не смотря на качество и стиль кода).


ВМоисеев
Клиент работает со списком сущностей в гриде. Корректирует нужную и выполняет UPDATE. В результате отображаемое состояние сущности может не изменится (в случае ок) или изменится на текущее её состояние в базе + отображение состояние не штатной ситуации.


Ну и при чём тут ХП, опять же?

Описанное вами поведение не правильно с точки зрения UX, но если забить на это, то никто не мешает сделать запрос актуальных данных при необходимости.

Короче, я так и не услышал ответ на вопрос, зачем вам ХП.
Ладно бы, у вас вся логика в ХП была сосредоточена, но тут и на клиенте логика и в БД логика, говнокод размазан по двум разным системам. Просто рай для сопровождения и развития.

Зачем? Только не говорите, что это всё ради экономии на лишнем запросе? Эта экономия нафиг никому не упёрлась, она не нужна и откровенно вредна.

Очередная преждевременная оптимизация . Уже, простите, блевать тошнит. Когда же вы уже научитесь... работать, а не фигнёй страдать...
...
Рейтинг: 0 / 0
Взаимодействие клиентов с БД.
    #39962456
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>hVostt, сегодня, 19:09 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1325462&msg=22139994][22139994]
>Это, извините, говнокод (даже не смотря на качество и стиль кода).
<
Что сказать, если одеть любителя желудей во фрак, мало что меняется. Не понимает он вкус моих апельсинов.
...
Рейтинг: 0 / 0
Взаимодействие клиентов с БД.
    #39962517
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
даже не смотря на качество и стиль кода

писать вот так:
Код: c#
1.
wspErr = null; if (!bl_Разрешение) return; bl_Разрешение = false; 


это не стиль, а говностиль. У него Enter на клавиатуре выломан там что ли?
...
Рейтинг: 0 / 0
Взаимодействие клиентов с БД.
    #39962521
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
и на клиенте логика и в БД логика, говнокод размазан по двум разным системам. Просто рай для сопровождения и развития.

Надо еще для полного комплекта по паре-тройке триггеров на каждую таблицу навесить, надобавлять вычисляемых полей и во вьюхи с аггрегацией позаворачивать.
...
Рейтинг: 0 / 0
Взаимодействие клиентов с БД.
    #39962932
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев
Что сказать, если одеть любителя желудей во фрак, мало что меняется. Не понимает он вкус моих апельсинов.


Я понял, что с вами не имеет смысла серьёзно ни о чём дискутировать. Так же не имеет смысла приводить вам какой-то код, непонятно зачем вы его просите, если вы его воспринимаете как баран, глядя на новые ворота.

Вместо адекватного ответа на заданный вопрос вы несёте какую-то дичь, упражняетесь в литературной эквилибристике, видимо ошиблись форумом, вам нужно в гуманитарный.
...
Рейтинг: 0 / 0
Взаимодействие клиентов с БД.
    #39962934
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
и на клиенте логика и в БД логика, говнокод размазан по двум разным системам. Просто рай для сопровождения и развития.

Надо еще для полного комплекта по паре-тройке триггеров на каждую таблицу навесить, надобавлять вычисляемых полей и во вьюхи с аггрегацией позаворачивать.


Я думаю, если бы ВМоисееву кто-то в своё время показал ещё и триггеры, то логика была бы ещё размазана и по триггерам
...
Рейтинг: 0 / 0
Взаимодействие клиентов с БД.
    #39962936
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
писать вот так:
Код: c#
1.
wspErr = null; if (!bl_Разрешение) return; bl_Разрешение = false; 



это не стиль, а говностиль. У него Enter на клавиатуре выломан там что ли?


Да, тут все печально, каждая строка кода вызвает слёзы.
...
Рейтинг: 0 / 0
Взаимодействие клиентов с БД.
    #39963026
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Я думаю, если бы ВМоисееву кто-то в своё время показал ещё и триггеры, то логика была бы ещё размазана и по триггерам

1. Название его хранимой процедуры вызывает ощущение, что она либо переделана из триггера, либо играет его роль. Я это ещё тогда отметил.

2. В триггерах нет ничего плохого. Разумеется, при уместном использовании.
...
Рейтинг: 0 / 0
Взаимодействие клиентов с БД.
    #39963110
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>softwarer, вчера, 03:52 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1325462&msg=22139430][22139430]
>...это будет явно эффективнее Вашего чуда.
<
Сделал так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
CREATE OR REPLACE FUNCTION public."au_Отделы_upd"("$pk_Entity" uuid, "$ts_Entity" bigint, "$str_Отдел" character varying)
 RETURNS refcursor
 LANGUAGE plpgsql
AS $function$  declare
    ErrorVar int;
    rfc refcursor;
  begin
    ErrorVar := 0;
    begin
      UPDATE "tbl_Отделы" SET "str_Отдел" = "$str_Отдел" 
      WHERE (("pk_Entity" = "$pk_Entity") and ("ts_Entity" = "$ts_Entity"));
      exception when others then  ErrorVar := 1;
    end;
    if ErrorVar = 1 then 
      open rfc for 
        SELECT t."pk_Entity", t."ts_Entity", t."str_Отдел"
        FROM "tbl_Отделы" t
        WHERE (t."pk_Entity"="$pk_Entity");
    else 
      open rfc for 
        SELECT t."ts_Entity"
        FROM "tbl_Отделы" t
        WHERE (t."pk_Entity"="$pk_Entity");
    end if;   
    return rfc;
  end;
$function$
; 
...
Рейтинг: 0 / 0
Взаимодействие клиентов с БД.
    #39963114
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев
Сделал так:

Даже не знаю, смеяться или плакать.
...
Рейтинг: 0 / 0
Взаимодействие клиентов с БД.
    #39963117
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
2. В триггерах нет ничего плохого. Разумеется, при уместном использовании.


Конечно, как можно сказать и про любой другой инструмент :)
Но зачастую ХП и триггеры так применяют, что хочется назвать их злом...
...
Рейтинг: 0 / 0
Взаимодействие клиентов с БД.
    #39963118
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
ВМоисеев
Сделал так:

Даже не знаю, смеяться или плакать.


Если бы на ревью в моей команде попал вот такой код, это был бы скорее всего скандал.

Выясняли бы, не заболел ли автор какой-нибудь серьёзной болезнью, а если нет, то кто его такого нанял...
...
Рейтинг: 0 / 0
Взаимодействие клиентов с БД.
    #39963138
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Но зачастую ХП и триггеры так применяют, что хочется назвать их злом...

Хотел бы я увидеть инструмент, который нельзя так применить и который при этом способен на что-то полезное.
...
Рейтинг: 0 / 0
25 сообщений из 323, страница 6 из 13
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Взаимодействие клиентов с БД.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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