2013-11-22 29 views
1

業增加值我想在一個日期已經從文本框中輸入該收入表總結量的值。總和()命令無法返回表

try 
{ 
    con.Open(); 
    SqlDataReader myReader = null;    
    SqlCommand cmd = new SqlCommand("select sum(amount) from income where date='" + TextBox15.Text + "'", con); 
    myReader = cmd.ExecuteReader(); 
    while (myReader.Read()) 
    { 
     TextBox16.Text = (myReader["amount"].ToString()); 
    } 
    con.Close(); 

} 
catch (Exception e1) 
{ 
    Label1.Text = e1.Message; 
} 

我量數據類型是小數

+1

注入攻擊tastic – Jodrell

+1

如果用戶輸入的日期是「'; DROP TABLE income; GO'」 – Jodrell

回答

1

問題:沒有列amount。 所以使用別名如下:

實施例:

select sum(amount) as totalamount from income where [email protected] 

=>以避免SQL注入攻擊使用參數化的查詢:

完整的解決方案:改變你的代碼如下:

try 
    { 
     con.Open(); 

     SqlDataReader myReader = null; 

     SqlCommand cmd = new SqlCommand("select sum(amount) as totalamount from income where [email protected]", con); 
     cmd.Parameters.Add(new SqlParameter("@datevalue", TextBox15.Text)); 
     myReader = cmd.ExecuteReader(); 

     while (myReader.Read()) 
     { 
      TextBox16.Text = (myReader["totalamount"].ToString()); 
     } 
     con.Close(); 

    } 
    catch (Exception e1) 
    { 
     Label1.Text = e1.Message; 
    } 
所有用戶的
2

首先參數化查詢,以避免SQL注入攻擊。

。在你的結果沒有列amount,要麼添加別名到您的聚合的結果,或只是從閱讀器返回一個值。

try 
{ 
    con.Open(); 
    SqlDataReader myReader = null; 

    SqlCommand cmd = new SqlCommand("select sum(amount) from income where date = @date", con); 
    cmd.Parameters.AddWithValue("@date", TextBox15.Text); 

    myReader = cmd.ExecuteReader(); 

    if (myReader.Read()) 
    { 
     TextBox16.Text =myReader[0].ToString(); 
    } 

    con.Close(); 

} 
catch (Exception e1) 
{ 
    Label1.Text = e1.Message; 
} 

也改變whileif因爲只有一個結果將被退回。

4

我看不出有任何理由,你的情況使用ExecuteReader。改爲使用ExecuteScalar,這正是您需要的,因爲您的查詢只返回一列一列。

執行查詢,並在返回 第一排的第一列由查詢返回的結果集。

而且您應該始終使用parameterized queries。這類字符串連接的是開放的SQL Injection攻擊。

例如;

SqlCommand cmd = new SqlCommand("select sum(amount) from income where date = @date", con); 
cmd.Parameters.AddWithValue("@date", TextBox15.Text); 
TextBox16.Text = cmd.ExecuteScalar().ToString(); 
1

你爲什麼不只是這樣做:

try 
{ 
    con.Open(); 

    SqlCommand cmd = new SqlCommand("select isnull(sum(amount),0) from income where date = @date", con); 
    cmd.Parameters.AddWithValue("@date", TextBox15.Text); 

    TextBox16.Text = cmd.ExecuteScalar().ToString(); 

    con.Close(); 

} 
catch (Exception e1) 
{ 
    Label1.Text = e1.Message; 
} 

如果你能找到的時候,試着給你的對象一些合理的名稱,完全不同於TextBox16 ...