Nano Hash - криптовалюты, майнинг, программирование

Динамический поиск строки sql и замена в C #

Я использую ADO DataReader для получения строк с сервера sql. Поскольку DataReader не имеет счетчика записей, мне нужно самому получить счетчик записей. Итак, в моем случае я хочу поместить исходный оператор sql, который передается динамическому классу, в подзапрос.

Пример

SELECT 
      id, 
      title, 
      value 
FROM table 
WHERE id = 1234 
ORDER BY title

должно быть

SELECT COUNT(*) 
   FROM (
         SELECT id, 
               title,
               value 
        FROM table 
        WHERE id = 1234 
        ORDER BY title)t

В этом случае нам нужно изменить оператор SQL, потому что синтаксис требует добавления TOP 100 PERCENT для правильной работы:

SELECT COUNT(*) 
FROM (SELECT TOP 100 PERCENT id, 
                     title, 
                     value 
              FROM table 
              WHERE id = 1234 
              ORDER BY title)t

Итак, я сделал это:

int fromIndex = this.SQL.IndexOf("SELECT", 
                     StringComparison.CurrentCultureIgnoreCase);
String countSql = "SELECT TOP 100 PERCENT" + 
                   this.SQL.Substring(fromIndex + 6);
countSql = "SELECT COUNT(*) FROM (" + countSql + ")t";

Но что, если в исходном заявлении уже есть предложение TOP, например

SELECT TOP 5 id, 
             title, 
             value 
 FROM table 
 WHERE id = 1234 
 ORDER BY title

или даже хуже

SELECT   TOP   5  
               id, 
               title, 
               value 
     FROM table 
     WHERE id = 1234 
     ORDER BY title

Так что мой код должен с этим справиться.

Кстати: если у кого-то есть гораздо более лучший подход к подсчету записей из любого оператора SQL, этот ответ также приветствуется!

ИЗМЕНИТЬ, чтобы прояснить мой вопрос. Ссылка Как получить количество строк с помощью SqlDataReader в C # объясняет, как это сделать. Я читал это. Мой вопрос в том, как обрабатывать входящий оператор SQL, чтобы добавить предложение TOP 100 PERCENT или нет.

21.05.2015

  • добавьте select @@rowcount после первого select, вы можете .NextResult прочитать это 21.05.2015
  • Взгляните на stackoverflow.com/questions/1383315/ 21.05.2015
  • Я попробовал этот ответ. = ›Запустить специальный SELECT COUNT (*), прежде чем это именно то, что я пытался сделать, и поскольку оператор sql является динамическим, я должен с этим справиться. @@ rowcount не дал мне точного подсчета в многопользовательской / многопользовательской системе ... 21.05.2015

Ответы:


1

Просто чтобы уточнить: запрос - это то, что передается динамически? А потом вы хотите узнать, сколько строк он прочитал? Я верю, как следует из одного комментария; вы можете добавить «select @@ rowcount» в конец переданного запроса; затем обратно в C # используйте .NextResult, чтобы перейти от результатов запроса к результату подсчета строк.

21.05.2015
  • На 100% безопасно ли, что @@ rowcount представляет числа из оператора sql независимо от того, сколько параллельных операторов запущено многими пользователями? 21.05.2015
  • Я так считаю; он должен получить @@ rowcount только для вашей транзакции по умолчанию; все остальное, что происходит, не должно иметь значения. 21.05.2015

  • 2

    DataReader может не иметь счетчика строк, но вы можете вычислить его, вызвав Read() во время синтаксического анализа набора результатов в вашей модели данных.

    Кроме того, ваш код уязвим для атак с использованием SQL-инъекций. Лучше использовать SqlCommand и добавлять SqlParameter объектов для параметров динамического значения вместо конкатенации строк.

    Вот базовый пример использования классов Read() и SqlCommand: MSDN - SqlDataReader.Read

    21.05.2015
  • Код не уязвим, поскольку переданный оператор sql уже настроен с помощью упомянутых вами методов. this.SQL - это просто внутреннее использование. Просто подсчет не будет работать, так как мой исходный оператор SQL держится, например. 1 миллион записей, но я получаю только первые 10 строк. 21.05.2015
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..