C# 用SQL划分值
我试图确定两个值(val1,val2)之间的平均值,它们都是表中的列。每次我运行代码时,它都将它们显示为0。我知道我使用的代码不是参数化的,但如果有人能告诉我我做错了什么,这会有很大帮助。这不是专业代码,只是我一直在做的一个快速项目C# 用SQL划分值,c#,sql,C#,Sql,我试图确定两个值(val1,val2)之间的平均值,它们都是表中的列。每次我运行代码时,它都将它们显示为0。我知道我使用的代码不是参数化的,但如果有人能告诉我我做错了什么,这会有很大帮助。这不是专业代码,只是我一直在做的一个快速项目 private static int findAVG(MySqlConnection conn) { int val1; int val2; float avg; string sql = "select val1 fro
private static int findAVG(MySqlConnection conn)
{
int val1;
int val2;
float avg;
string sql = "select val1 from accounts where name = '" + Login.name + "';";
MySqlCommand cmd = new MySqlCommand(sql, conn);
val1 = Convert.ToInt32(cmd.ExecuteScalar());
sql = "select val2 from accounts where name = '" + Login.name + "';";
cmd = new MySqlCommand(sql, conn);
val2 = Convert.ToInt32(cmd.ExecuteScalar());
if (val2 != 0)
{
avg = val1 / val2;
}
else
{
avg = 0;
}
sql = "update accounts set avg = " + avg + " where name = '" + Login.name + "';";
cmd = new MySqlCommand(sql, conn);
cmd.ExecuteNonQuery();
return 0;
}
谢谢你的回答。直接原因是整数除法:当你把两个整数除法时,val1/val2
在你的例子中,结果是
也将是整数,例如1/2==0
因此,快速更正将转换为double
,而不是int
:
double val1;
double val2;
doubel avg;
...
val1 = Convert.ToDouble(cmd.ExecuteScalar());
...
val2 = Convert.ToDouble(cmd.ExecuteScalar());
...
更好的选择是让RDMBS为您完成工作(表update
):
请注意,对于整数,我们有
1/2==0
,而对于double1.0/2==0.5
。尝试val1=Convert.ToDouble(cmd.ExecuteScalar())
@DmitryBychenko谢谢,我要试试。平均值应该是(val1+val2)/2
。但是,另外,你在玩整数游戏,所以结果将是一个整数。尝试:avg=(十进制)(val1+val2)/(十进制)2
或avg=(十进制)(val1+val2)/2m代码>
private static int findAVG(MySqlConnection conn) {
//DONE: do not hardcode, but parametrize the query (@prm_Name)
string sql =
@"update Accounts
set avg = val1 / val2
where name = @prm_Name";
//DONE: wrap IDisposable (cmd) in using
using (MySqlCommand cmd = new MySqlCommand(sql, conn)) {
cmd.Parameters.Add("@prm_Name", Login.name);
// let's return number of records affected
return cmd.ExecuteNonQuery();
}
}