在 C#/mysql 上查询 return

Query return on C#/mysql

我的 class "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查询结果的命令是什么? 我想使用这个命令,插入一个变量。你能纠正我吗?

我想你想要的命令是

command.ExecuteScalar();

但是,请注意,Execute Scalar 的目的是使结果 return 单行单列,您的查询在不考虑您的参数的情况下执行该操作。但是,您的查询也没有特别意义..

现在您的查询本身。您有一个明确的 prezzo ,这意味着现有的列名而不是参数的名称。出于显而易见的原因,它必须是一个数字字段才能对其求和。

现在您还有一个预期的字符串通过 "costo" 参数传入函数调用。如果您的意图是让传入的字符串代表 table 的已知列,这对您不起作用。您将不得不使用该明确的列名称构建 SQL 命令,或者构建动态 -sql,但这确实太多了。

构建带有字符串参数的 SQL 语句的问题是您可能会对 SQL 注入持开放态度,特别是如果基于 Web。如果您的传入字符串来自受控源,例如您正在向用户展示一列列,而他们只能选择一个这样的列。或者,您在屏幕上有一些按钮要求某个事物的总和,并且您控制该列名称您会处于更好的状态,但仍然要谨慎传递参数以构建 SQL.

例如,假设您的 table 具有 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-终止符和新语句...

但希望这能澄清我认为您正在努力完成的事情。