在 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-终止符和新语句...
但希望这能澄清我认为您正在努力完成的事情。
我的 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-终止符和新语句...
但希望这能澄清我认为您正在努力完成的事情。