Задать вопрос
  • C# Asp Net Core 6 MVC не держит аутентификацию по куки заданное время на IIS, что может быть не так?

    @saneok44 Автор вопроса
    Илья Голец, мне кажется что моя конфигурация сессии по куки не работает всвяски с кастомным мидлваре по проверки аутентификации. Потому что я заметил что на момент когда сервер разворачивается авторизованного пользователя пройти авторизацию у этого пользователя уже есть куки авторизации. Из этого я делаю вывод что пользователь хранит токен авторизации который должен совпадать с токеном на сервере, и пользователя разворачивает на авторизацию. Причем время удержания составляет дефолтные 30 минут. Из этого делаю вывод что моя конфигурация аутентификации по куки не работает она в (дефолтном) состоянии. Причем есть еще один проект с точно такой же реализацией и там все работает как задумано.... Пока что я написал свою кастомную реализацию без подкапотных клаймсов, и вот это работает как и задумывалось куки закодированы и держаться указанное время.
    Написано
  • MS SQL, почему медленно выполняется запрос когда передаю много параметров?

    @saneok44 Автор вопроса
    это не выход так как условия отбора динамические, решение в общем уже найдено путем встраивания (постоянных) параметров в шапку текстовки запроса переде select, а (динамические) параметры и параметры по типу DateTime или тек которые подвержены инъекции все также передаю через command.Parameters. После таких манипуляций вышел на +/- 4 секунды
    *постоянные тек которыми не управляет пользователь
    *динамические те что выбирает пользователь для отбора конечного

    Вероятнее всего проблема может быть связанна с данными

    Параметры в подавляющем случает интовые и 2 штуки DateTime, никаких сложных преобразований в самом запросе нет.
    Написано
  • MS SQL, почему медленно выполняется запрос когда передаю много параметров?

    @saneok44 Автор вопроса
    firstmixon, составной кластеризованный индекс имеется усечение выборки идет как раз по индексированным полям. Перестроение индексов ранее выполнялась, дефрагментация менее 10%. В запросе так же участвуют процедуры.
    Написано
  • MS SQL, почему медленно выполняется запрос когда передаю много параметров?

    @saneok44 Автор вопроса
    mayton2019,

    Pantuchi, смотри. Разница между 4 и 27 секунд важна не для твоего кода а для бизнеса.
    Спроси бизнес как они хотят?
    Ни кто не любит ждать)
    от инъекций перестраховался, пользовательский ввод не попадает
    Написано
  • MS SQL, почему медленно выполняется запрос когда передаю много параметров?

    @saneok44 Автор вопроса
    firstmixon, это разовый запрос. Запрос писал в MS SQL прогнал, выполнился быстро. Перенес текстовку на c# в метод, обернул юзингами, добавил параметры в SQLCommand, запустил, результат получил через ~27 секунд вместо 4 секунд в MSSQL думал может я праметры передал каряво что он их динамически типизирует, ладно указал типы для параметров это проблемы не решило, глазами парсил листинг так ничего не увидел, подсмотрел как делает запросы начальник. Перенял подход некоторые параметры вшивать прямо в листинг перед select. Повторил запос и ахренел как быстро он выполнился. Пришел к выводу, что черезмерное большое количество параметров переданных через SQLCommand каким то образом душит запрос или анализатор (не знаю). Я так и не понял почему запрос так медленно выполнялся, я даже развернул базу на домашнем пк и результат был такой же медленный, прям загадка. Как только не вертел запрос, но единственный лучший вариант был это вшить некоторые параметры int, decimal и даже string в листинг запроса, а DateTime я так и оставил в параметрах SQLCommand. После этих манипуляций запрос выполнился ожидаемо быстро. [для меня это пока загадка]
    Написано
  • MS SQL, почему медленно выполняется запрос когда передаю много параметров?

    @saneok44 Автор вопроса
    это один из вариантов добавления параметра, суть проблемы не меняет
    Написано
  • Django django.db.connection как сменить логин и пароль на подключении внутри метода?

    @saneok44 Автор вопроса
    Everything_is_bad, согласен что взаимодействие с базой через Django не уместно тут. Я что то уперся в это ...
    Написано
  • Django django.db.connection как сменить логин и пароль на подключении внутри метода?

    @saneok44 Автор вопроса
    Everything_is_bad, использую, вот только принцип моделей мне не совсем подходит тут (вернее получение данных), у меня нет тематических таблиц. У меня множество предметных областей в рамках одной таблицы и поэтому мне проще самому писать sql чем использовать движок джанго. Я пробовал уже вытаскивать данные как по методичке .... не удобно.
    Всего 4 таблицы описывающие разные предметные области.
    Написано
  • Django django.db.connection как сменить логин и пароль на подключении внутри метода?

    @saneok44 Автор вопроса
    Everything_is_bad, надо чтобы запрос выполнялся из под учетки sql которая связана с авторизованным пользователем.
    Логика действий:
    1. Есть пользователь в базе у него есть ник пароль входа и логин и пароль sql учетки.
    2. При прохождении аутентификации пользователь работает с базой через свою учетку sql выполняя инструкции из под этой цчетки.
    Написано
  • Django mssql как выполнить чисты запрос в utf16?

    @saneok44 Автор вопроса
    Методом экспереметов в sql получлось разобраться что sql квстит значения к типу varchar из за чего cast к nvarchar был некорректен.

    Переписал declare и все отработало корректно

    def addLogError(errText: str, sqlText: str, parameters: str, functionname: str, username: str, appname: str):
        connection = None
    
        sql = (f'declare @v_errText nvarchar(max) = \'{errText}\';'
               f'declare @v_sqlText nvarchar(max) = \'{sqlText}\';'
               f'declare @v_parameters nvarchar(max) = \'{parameters}\';'
               f'declare @nv_fn nvarchar(max) = cast(\'{functionname}\' as nvarchar(max));'
               f'declare @nv_un nvarchar(max) = cast(\'{username}\' as nvarchar(max));'
               f'declare @nv_appname nvarchar(max) = cast(\'{appname}\' as nvarchar(max));'
               f''
               f'insert into LogErr([errText], [sqlText], [parameters], [functionname], [username], [AppName]) '
               f'VALUES('
               f'   cast(@v_errText as varbinary(max)), '
               f'   cast(@v_sqlText as varbinary(max)), '
               f'   cast(@v_parameters as varbinary(max)), '
               f'   @nv_fn, @nv_un, @nv_appname'
               f')')
    
        try:
            connection = django.db.connections['default']
            cursor = connection.cursor()
            cursor.execute(sql)
        except BaseException as e:
            print(e)
        finally:
            if connection:
                connection.close()
    Написано
  • Не устанавливается Express, как исправить?

    @saneok44 Автор вопроса
    я 2017 ставил и 2022 ставил, да и к тому же как не поддерживается когда я только что поставил по своему методу!
    могу скрин скинуть, ноут Windows 11 Home
    659c349beb679884229184.png
    Написано
  • Не устанавливается Express, как исправить?

    @saneok44 Автор вопроса
    Константин Цветков, ссылка на файл логов: Summary_PC1_20240108_145529.txt
    Настройки
    659bc8bc4dec0311514126.png
    659bc8c5cf99e800196824.png
    659bc8d0788ff623834018.png
    Написано
  • Не устанавливается Express, как исправить?

    @saneok44 Автор вопроса
    Константин Цветков, у меня есть ноут на котором 1 ssd m2 на нем 1 раздел с виндой. Я спокойно на него поставил MS SQL Server ничего не меняя. На работе 1 SSD диск sata с 1 разделом на котором винда 11 и тоже все спокойно установилось. На компе стационарном 1 ssd m2 на 512 PCI 4.0 x4 на нем система Win11 pro, 1 ssd m2 1Gb PCI 3.0, и HDD. Ставлю на диск с системой и Ошибка при ожидании дескриптора восстановления ядра СУБД. Меняю при установки корневой каталог экземпляра на другой диск ssd m2 1Gb. И все установилось. Получается компоненты SQL на диске с виндой, а экземпляр на другом диске.
    Ошибку вызывает только развертывание ядра субд, компоненты то ставятся.
    ПС: Ставил и по дефолту и меняя учетные записи всегда была ошибка. Дело дошло даже до того что систему снес.
    Написано
  • C# SqlTransaction блочит таблицу, как обойти блокировку или что делаю не так?

    @saneok44 Автор вопроса
    Kano, я не могу скинуть сюда листинг запросов. Так как первый запрос из 145 строк, мелки вообще длиной порядка 1-3 строк, последний на 500 строк. Могу сказать одно, первый запрос удаляет объект из тб1 и тб2, затем мелки запросы обращаются к тб1 и тб2 получают данные и передают запросу последнему, который может произвести удаление из тб1 и тб2 или просто изменить данные в тб2. И все это выполняется в транзакции на C#. И проблема была в том что когда первый запрос выполнил удаление, мелкие запросы пошли устанавливать свой коннект к базе для того чтобы получить данные из тб1 и тб2. Новый коннект устанавливался, но запрос вываливался по таймауту, а все это время висит открытая транзакция.
    Переписал так что мелкие методы могут создавать свое подключение или использовать уже установленное подключение и работать в составе транзакции. И проблема решена.

    PS: Я просто не представляю как вам это все скидывать вы с ума сойдете так как у меня все не так прозрачно написано как это на пабликах показывают. То что вы запросы увидите это вам ничего не даст, я их выполнял через ms sql studio одновременно, с задержкой и блокировок никаких не было. Повторюсь ... блокируется именно запрос выполняемый (не в режиме транзакции) на новом подключении во время активной транзакции, которая уже внесла изменения в таблицу. И все это под одним именем входа. Вываливается такой запрос по таймауту.
    Если я оберну мелкий запрос в свою транзакцию то это тоже решает проблему. Но я не хочу на мелкие запросы вешать собственную транзакцию, это не по назначению. Поэтому я включаю по необходимости мелкие запросы в состав транзакции и все. Уровни изоляции мне тут не нужны, мне нужна гарантия выполнения всех команд.
  • C# SqlTransaction блочит таблицу, как обойти блокировку или что делаю не так?

    @saneok44 Автор вопроса
    Переписал базовые класс и его методы на работу в режиме своего коннекта либо в режиме как часть транзакции. Протестил все работает.
    Более крупный класс унаследовал от базового класса с мелкими методами. В базовый класс объявил два свойства коннект и трансактион. Мелкие методы по этим свойствам определяют как им работать.

    В крупном классе в методе под using инициирую транзакцию и задаю всему классу режим транзакции передав в его свойства, которые он унаследовал от базового класса, SQLConnection и SQLTransaction теперь весь класс работает в режиме одной транзакции включая мелкие методы. По завершении блока using SQLConnection и SQLTransaction диспозятся тем самым переводя весь класс в режим обычный не транзакции.
  • C# SqlTransaction блочит таблицу, как обойти блокировку или что делаю не так?

    @saneok44 Автор вопроса
    Дополнение: Стал переписывать мелкие методы для двух режимов, собственный коннект или работа как часть транзакции.
  • C# SqlTransaction блочит таблицу, как обойти блокировку или что делаю не так?

    @saneok44 Автор вопроса
    Листинг мелкого метода:
    public DateTime getDatetimeValue(int ID, int propertyID)
            {
                string sql = "select dbo.getDatetimeValue(@ID, @propertyID)";
                DateTime result = new DateTime();
    
                using (SqlConnection con = new SqlConnection(stringConnect))
                {
                    SqlCommand com = new SqlCommand(sql, con);
                    com.Parameters.Add(new SqlParameter("@ID", ID));
                    com.Parameters.Add(new SqlParameter("@propertyID", propertyID));
    
                    try
                    {
                        con.Open();
                        object val = com.ExecuteScalar();
                        DateTime.TryParse(val.ToString(), out result);
                    }
                    catch (Exception e)
                    {
                        string stack = e.StackTrace;
                        string msg = e.Message;
                        string method = "getDatetimeValue";
                        string param = "ID=" + ID + "; propertyID=" + propertyID + ";";
    
                        addlogErr(WebConfigurationManager.AppSettings["AppName"], method, param, msg, stack);
                        Debug.WriteLine(formaExceptionMsg(method, param, msg, stack));
    
                        if (interceptException)
                            throw new Exception(method, e);
                    }
                    finally
                    {
                        con.Close();
                    }
                }
    
                return result;
            }


    Краткий листинг крупного метода инициирующего транзакцию: (черновой не критиковать что нет using-ов)))
    public void RemoveAndGlue(int userID, int periodID)
            {
               //.....
    
                SqlConnection connection = new SqlConnection(ark.stringConnect);
                connection.Open();
                SqlTransaction transaction = connection.BeginTransaction(IsolationLevel.ReadUncommitted);
    
                try
                {
                    ModelPeriod model = GetPeriod(periodID);
                    if (model == null) throw new Exception("Ошибка операции");
    
                    List<int> items = GetFriends(periodID);
    
                    SqlCommand command1 = _Delete(userID, periodID);
                    command1.CommandTimeout = 60;
                    command1.Connection = connection;
                    command1.Transaction = transaction;
                    command1.ExecuteNonQuery();
    
                    ModelPeriod uPeriod = null;
                    if (items[0] > 0 && items[2] > 0)
                    {
                        DateTime dateEnd = ark.getDatetimeValue(items[2], pid_dateBegin); //<-- вываливается по таймауту
                        dateEnd = dateEnd.AddDays(-1);
                        uPeriod = new ModelPeriod();
                        uPeriod.PeriodID = items[0];
                        uPeriod.DateBegin = ark.getDatetimeValue(items[0], pid_dateBegin); //<-- вываливается по таймауту
                        uPeriod.DateEnd = dateEnd;
                    }
                    else if (items[0] > 0 && items[2] <= 0 && (status == pid_active || status == pid_expired))
                    {
                        DateTime dateEnd = ark.getDatetimeValue(items[0], pid_dateEnd); //<-- вываливается по таймауту
                        ark.setDatetimeValue(contractId, pid_c_dateEnd, dateEnd); //<-- вываливается по таймауту
                    }
                    else if (items[0] <= 0 && items[2] > 0)
                    {
                        DateTime dateBegin = ark.getDatetimeValue(contractId, pid_c_dateBegin); //<-- вываливается по таймауту
                        uPeriod = new ModelPeriod();
                        uPeriod.PeriodID = items[2];
                        uPeriod.DateBegin = dateBegin;
                        uPeriod.DateEnd = ark.getDatetimeValue(items[2], pid_dateEnd); //<-- вываливается по таймауту
                    }
    
                    if (uPeriod != null)
                    {
                        SqlCommand command2 = Command_UpdateCascadePeriod(userID, uPeriod);
                        command2.CommandTimeout = 60;
                        command2.Connection = connection;
                        command2.Transaction = transaction;
                        command2.ExecuteNonQuery();
                    }
    
                    transaction.Commit();
                }
                catch (Exception ex)
                {
                    transaction.Rollback();
                    throw new Exception(ex.Message);
                }
                finally
                {
                    connection.Close();
                }
            }
  • C# SqlTransaction блочит таблицу, как обойти блокировку или что делаю не так?

    @saneok44 Автор вопроса
    Да я также думаю, передавать в мелкие методы транзакции благо они у меня как базовые методы взаимодействия с базой. Буду наследовать класс с мелкими методами для класса с крупными и передавая или задавая транзакцию для крупного метода мелкие методы будут выбирать альтернативное подключение как транзакция.
    Протестил разные варианты:
    Оказывается нет блокировки таблицы, блокировка идет как то на уровне библиотеки. Кака я это понял:
    Стартанул проект и сделал два подключения к сайту через два разных браузера и учетки. Одна учетка дернула метод с транзакцией которая эмулировала долгую транзакцию, а вторая учетка сделала запрос к таблице и никакой блокировки. Даже если я в двух браузерах авторизуюсь под одной учеткой sql тоже нет блокировки тб.
    Блокировка идет только из текущего запущенного потока подключения пользователя. Т.е. если запущена транзакция в работе и до коммита идет метод по подключению к базе, то этот метод коннектится к базе но запрос по таймауту вываливается, и чтобы это избежать нужно этот запрос включить в транзакцию. Заметил еще что это блокировка срабатывает когда были внесены изменения и эта блокировка распространяется только на текущий поток приложения. И такое ощущение что это не на уровне ядра блокировка ...
    P.S. Повторюсь мелкие методы у меня подключаются не по ACID а обычным способом.
  • Как избежать коллизии по данным?

    @saneok44 Автор вопроса
    Спасибо за совет, сегодня провели анализ нагрузки и пришли к выводу, что из за роста объема данных некоторые тяжеловесные запросы стали нагружать sql. Пришли к выводу , что надо пытаться оптимизировать некоторые запросы и минимизировать запросы со стороны клиента когда данные ему вообщем то не нужны и грузить их лишний раз не стоит.

    На счет уникально ID запроса ... тут я не знаю как прокомментировать. У нас в sql есть учетные данные входа по котором пользователь авторизуется и работает с базой, есть так же дефолтная учетка для неавторизованных пользователей. Все веб приложения используют учетные данные входа и тут я думаю нужно наверное какой то уникальный ID делать в связке приложение + учетка sql. Может это уже под капотом есть IIS + SQL пока не могу сказать. Не давать стакать запросы пока не завершиться первый ... ну это так бешенная идея