C# cmd.ExecuteNonQuery(); MessageBox.Show(“数据成功更新”); con.Close(); } 捕获(异常错误) { Show(error.ToString()); } for(int i=0;i

C# cmd.ExecuteNonQuery(); MessageBox.Show(“数据成功更新”); con.Close(); } 捕获(异常错误) { Show(error.ToString()); } for(int i=0;i,c#,sql,C#,Sql,您需要对金额列中的进行分组。您的问题的一个简单答案是修改第二个select查询,如下所示: sql = "SELECT Year, dID, SUM(Amount) as Amount FROM Overview where dID = '" + txtdID.Text + "' AND Year = " + txtYear.Text + "GROUP BY amount"; 您可能希望使用txtYear.Text值作为SQL参数,因此: txtYear.Text = sql; 及 代码中

您需要对
金额
列中的
进行分组。您的问题的一个简单答案是修改第二个select查询,如下所示:

sql = "SELECT Year, dID, SUM(Amount) as Amount FROM Overview where dID =  '" + txtdID.Text + "' AND Year = " + txtYear.Text + "GROUP BY amount";
您可能希望使用
txtYear.Text
值作为SQL参数,因此:

txtYear.Text = sql;

代码中不要有太多意义

当然,这不是正确的方法,因为它很容易发生。我建议您使用,这对于SQL注入来说绝对更安全


代码质量的另一个改进是,您应该使用语句来封装
SQLConnection
SQLCommand
SQLDataReader
对象初始化。

为人们关于参数和sql注入的评论添加解决方案,我倾向于在连接到任何数据库时使用下面的代码

using(SqlConnection connection = new SqlConnection("YOUR CONNECTION STRING"))
{
    try
    {
        using(SqlCommand command = new SqlCommand())
        {
            command.CommandText = "SELECT * FROM members where dID = @MyId";
            command.Connection = connection;

            // Set the SqlDbType to your corresponding type
            command.Parameters.Add("@MyId", SqlDbType.VarChar).Value = txtdID.Text;

            connection.Open();

            SqlDataReader reader = command.ExecuteReader();

            while (reader.Read())
            {
                txtID.Text = reader["ID"].ToString();
                txtName.Text = reader["Name"].ToString();
                txtAddress.Text = reader["Address"].ToString();
                txtMobile.Text = reader["Mobile"].ToString();
                txtEmail.Text = reader["Email"].ToString();
                txtdID.Text = reader["dID"].ToString();

            }
        }
    }
    finally
    {
        connection.Close();
    }
 }

不要连接sql字符串,而是使用
参数
。您可以在此处进行SQL注入:
SELECT*FROM Overview where dID='1〕“+txtdID.Text
。顺便说一句,为什么你要在代码中添加所有的
?您可以使用
code
-按钮在编辑器中格式化代码。看一看。这是家庭作业问题吗?到目前为止,您尝试了什么?尽量不要避免使用直接SQL,在大多数情况下,请使用存储过程。如果除了简单的选择之外没有其他选择,请使用视图,然后从前端调用您的过程。@LukeHennerley这是一个复杂的领域,没有单一的答案。使用SP/视图可能会限制部署灵活性和其他方面。十年前,SPs曾经有着巨大的优势——但现在:它们与正确参数化的即席命令没有太大区别。你必须手工编写SQL吗?为什么不尝试改用LINQtoSQL呢。这些看起来很简单。非常感谢你的评论和批评,相信我,一个人学到了很多,但请原谅我,我可能达不到每个人的标准。我珍视每一条评论。我已经注意到,尽管我试图更详细和清晰(可能是因为我是一个新手),这就是为什么人们同时说太宽泛和太本地化。好吧,总结一下,我只需要首先搜索会员每年支付的金额!!!我不想要金额的总和我不想要年度金额,不是这样的。我的数据库里有John Doe,比如说他的10年记录。现在我可以添加新表单,只想搜索他在过去十年中每年支付的金额。我输入他的dID并插入2002年结果300 paid!我把他的dID再次插入2005年;结果在2005年,他并没有支付任何费用,我可以继续这样做。最后,我可以通过这个过程知道,在我十年的搜索中,他可能已经三年没有付款了。这就是我想要达到的目标。
txtYear.Text = txtYear.Text + " : " + sql;
using(SqlConnection connection = new SqlConnection("YOUR CONNECTION STRING"))
{
    try
    {
        using(SqlCommand command = new SqlCommand())
        {
            command.CommandText = "SELECT * FROM members where dID = @MyId";
            command.Connection = connection;

            // Set the SqlDbType to your corresponding type
            command.Parameters.Add("@MyId", SqlDbType.VarChar).Value = txtdID.Text;

            connection.Open();

            SqlDataReader reader = command.ExecuteReader();

            while (reader.Read())
            {
                txtID.Text = reader["ID"].ToString();
                txtName.Text = reader["Name"].ToString();
                txtAddress.Text = reader["Address"].ToString();
                txtMobile.Text = reader["Mobile"].ToString();
                txtEmail.Text = reader["Email"].ToString();
                txtdID.Text = reader["dID"].ToString();

            }
        }
    }
    finally
    {
        connection.Close();
    }
 }