我正在尝试返回MAX值,但它会一直返回0.
string stateValue = "CA";
SqlCommand cmd = new SqlCommand("SELECT MAX(Population) FROM TestData WHERE State=" + stateValue);
cmd.Parameters.Add("@Population", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;
DBConnection.Instance.execNonQuery(cmd);
int population = (int)cmd.Parameters["@Population"].Value;
在DBConnection
类中,这是execNonQuery
函数:
public int execNonQuery(string sCmd, CommandType cmdType)
{
SqlCommand cmd = new SqlCommand(sCmd, m_sqlDataBase);
cmd.CommandType = cmdType;
try
{
m_sqlDataBase.Open();
}
catch { }
return cmd.ExecuteNonQuery();
}
答案 0 :(得分:4)
参数方向与存储过程一起使用。这里只是执行一个查询。您需要使用SqlCommand.ExecuteScalar
方法,因为您只能获得一个结果。它会返回object
,因此您必须先将其转换为int
才能使用它。
此外,您的代码使用字符串连接来创建SQL查询,它很容易SQL Injection。还可以考虑在命令和连接中使用using
statement。
using (SqlCommand cmd = new SqlCommand("SELECT MAX(Popluation) FROM TestData WHERE State=@state"))
{
//Associate connection with your command an open it
cmd.Parameters.AddWithValue("@state", stateValue);
int populuation = (int)cmd.ExecuteScalar();
}
答案 1 :(得分:2)
ExecuteNonQuery调用不会返回执行查询的结果。
您可以使用ExecuteScalar或执行来获取值。
public int execQuery(string sCmd, CommandType cmdType)
{
SqlCommand cmd = new SqlCommand(sCmd, m_sqlDataBase);
cmd.CommandType = cmdType;
try
{
m_sqlDataBase.Open();
return Convert.ToInt32(cmd.ExecuteScalar());
}
catch {
// handle your error but don't trap it here..
throw;
}
}
ExecuteScalar是获取第一个值或第一个结果集的短路。您可以使用它从查询中返回单个值,例如您的。
另一种选择是使用Execute方法获取结果集,然后使用它来获取您所追求的值:
public int execQuery(string sCmd, CommandType cmdType)
{
SqlCommand cmd = new SqlCommand(sCmd, m_sqlDataBase);
cmd.CommandType = cmdType;
try
{
m_sqlDataBase.Open();
using(var dataReader = cmd.Execute())
{
if (dataReader.Read())
{
return Convert.ToInt32(dataReader[0]);
}
}
}
catch {
// handle your error but don't trap it here..
throw;
}
}
答案 2 :(得分:0)
如何'回合
var sql = string.Format("SELECT MAX(Popluation) FROM TestData WHERE State='{0}'", stateValue);
SqlCommand cmd = new SqlCommand(sql);
(重要的部分是添加单引号.string.Format是为了让它看起来很漂亮)