Запрос возврата на C # / MySQL - PullRequest
0 голосов
/ 22 апреля 2020

У меня в классе "fattura" это

public string sommaFattura(String costo)
    {
MySqlCommand command = new MySqlCommand();
            String sumQuery = "SELECT SUM(`prezzo`) FROM `fatturetemp`";
            command.CommandText = sumQuery;
            command.Connection = conn.getConnection();
            command.Parameters.Add("@prezzo", MySqlDbType.Int32).Value = costo;
            conn.openConnection();
//Need the command for take the result
                conn.closeConnection();
}

Какая команда используется для получения результата запроса Sum? Я хочу использовать эту команду, вставить в переменную. Вы можете исправить меня?

1 Ответ

1 голос
/ 22 апреля 2020

Я думаю, что вам нужна команда

command.ExecuteScalar();

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

Теперь ваш запрос сам по себе. У вас есть явное prezzo, которое подразумевает имя существующего столбца, а не имя параметра. По очевидным причинам для его суммирования потребуется поле числового значения c.

Теперь у вас также есть ожидаемая строка, поступающая через параметр "costo" в вызов функции. Если ваше намерение состоит в том, чтобы входящая строка представляла известный столбец таблицы, это не сработает для вас. Вам нужно будет создать команду SQL с таким явным именем столбца или выполнить динамическую c - sql, но это будет слишком много.

Забота о создании SQL оператор со строковыми параметрами, вы будете открыты для SQL -инъекции, особенно если это веб-интерфейс. Если ваша входящая строка поступает из контролируемого источника, например, вы представляете список столбцов пользователю, и он может выбрать только один такой столбец. Или у вас есть кнопки на экране, запрашивающие сумму определенной вещи, и вы контролируете имя столбца, которое будет в лучшем состоянии, но все же будьте осторожны, передавая параметр для построения SQL.

Скажем, например, ваша таблица имеет числовые c поля qtySold и dollarSales. Вы хотите либо сумму любого из этих столбцов и передать одну из этих соответствующих строк в функцию, такую ​​как

var qtySoldAnswer = sommaFattura( "qtySold" );
   or
var dollarSalesAnswer = sommaFattura( "dollarSales" );

Тогда ваша функция будет ближе к ...

public string sommaFattura(String costo)
{
   MySqlCommand command = new MySqlCommand();
   command.CommandText = "SELECT SUM(" + costo + ") FROM fatturetemp";
   command.Connection = conn.getConnection();
   conn.openConnection();
   var answer = command.ExecuteScalar();
   conn.closeConnection();

   // I would put a breakpoint in here to see the results.
   // you can then format the answer such as decimal point, etc.
   return answer.ToString();
}

СНОВА, ТОЛЬКО если ВЫ контролируете имя столбца, который пытаетесь отправить. Кто-то может сделать sql -инъекцию и нанести большой урон. Я сделал бы только строго контролируемое рассмотрение и явную проверку столбцов, которые вы позволили бы, и если это так, установите вашу переменную в этой точке. Не допускайте больше или меньше, чем имя столбца. Никаких специальных символов, кавычек, комментариев, sql -определителя и нового утверждения ...

Но, надеюсь, это проясняет то, что, я думаю, вы пытаетесь выполнить sh.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...