C# 用SQL划分值

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

我试图确定两个值(val1,val2)之间的平均值,它们都是表中的列。每次我运行代码时,它都将它们显示为0。我知道我使用的代码不是参数化的,但如果有人能告诉我我做错了什么,这会有很大帮助。这不是专业代码,只是我一直在做的一个快速项目

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
,而对于double
1.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(); 
  }
}