在 C# 中禁用 = 0 时更新

Update if disabled = 0 in C#

我正在 C# 中制作一个项目- 可以 "vote"。

当您 运行 首次登录该程序时。登录后,您必须 select 从下拉列表中选择一个值。在你 select 编辑了老师之后,你按下了一个投票按钮。

问题是我真的不知道如何让它正确验证。并检查该人是否已经投票。

如果值为 1 或 0,它必须检查名为 "disabled" 的数据库中的列。如果值为 1,则不能投票,如果为 0,则可以。

当此人投票时,它会将 aantalStemmen 列增加 1。disabled 列也会增加 1。显示在数据网格视图中。

并且下拉列表中的值必须与数据库中的 1 匹配。

我有这个代码:

 private void db_connection()
    {
        try
        {
            conn = "Data Source=localhost;Initial Catalog=docent;Integrated Security=True";
            connect = new SqlConnection(conn);
            connect.Open();
        }
        catch (SqlException e)
        {
            throw;
        }
    }
    private bool validate_disabled(string favoriet)
    {
        db_connection();
        SqlCommand cmd = new SqlCommand();
        cmd.CommandText = "Select disabled from leerling";
        cmd.Connection = connect;
        SqlDataReader disabled = cmd.ExecuteReader();
        if (disabled.Read())
        {
            connect.Close();
            return true;
        }
        else
        {
            connect.Close();
            return false;
        }
    }



    private void btnStem_Click(object sender, EventArgs e)
    {
        string favoriet = cmbFavoriete.Text;

        db_connection();
        SqlCommand cmd = new SqlCommand();

        bool r = validate_disabled(favoriet);

        if(r){

        cmd.CommandText = "UPDATE docent SET aantalStemmen = aantalStemmen + 1 where docentid=@id";
        cmd.Parameters.AddWithValue("@id", cmbFavoriete.Text);
        }
        else
        {
MessageBox.Show("You have already voted.");
        }

    }

我的数据库中的表如下所示:

在此先感谢,我一直在努力解决这个问题,因为我仍然是 C# 的新手。

我建议您在 table 中使用 bit 数据类型 (0 - false, 1 - true) 而不是 int 数据类型.它完全满足您的需求,您不必为此使用 int

这意味着您可以更改 validate_disabled 方法以使用如下内容:

cmd.CommandText = "SELECT disabled FROM leerling WHERE disabled = 1 AND leerlingnummer = @favoriet";
cmd.Parameters.AddWithValue("@favoriet", favoriet);

我假设字符串 favoriet 等于 table 中的 leerlingnummer。执行该查询后,您只需检查查询是否包含超过 0 条记录 - 如果超过 0 条记录意味着该人没有投票权限。

我将尝试回答以涵盖您代码的更多方面(许多已在评论中提到):

1) 在您的方法之外声明您的连接字符串。 还要选择有意义的变量名 - 几个月后您重新访问代码时,您会比自己更清楚。

private const String ConnectionStr = "Data Source=localhost;Initial Catalog=docent;Integrated Security=True";

2。适当的方法名称 - 另外,尝试使用 Camel 或 Pascal 大小写作为方法名称。

3。注意可能的异常。 SQLExceptionnot the only possible exception 在构造或打开 SqlConnection 时,所以最好捕获任何可能发生的东西

private SqlConnection createConnection
{
   try
    {
        connect = new SqlConnection(ConnectionStr);
        connect.Open();
    }
    // this is laziness, but it is better than before 
    catch (Exception e)
    {
        // best to log the real error somewhere
        throw;
    }
}

4.处理连接和其他一次性用品,如 SqlCommand。 var 也可以节省一些输入(只需将鼠标悬停在关键字上,您就会看到实际类型)。

SqlConnection 允许使用 CreateCommand.

直接创建要使用该特定连接执行的命令

由于您需要单个值(标量)(或单行单列),您可以使用 ExecuteScalar 方法。所以,不再 reader.

private bool isDisabled(string favoriet)
{
    using (var connection = createConnection())
    {
        using (var cmd = new connection.CreateCommand())
        {
            cmd.CommandText = "Select disabled from leerling where leerlingnummer = @number";
            cmd.Parameters.AddWithValue("@number", favoriet);

            // for simplicity I have assumed that it will always find a value. This should be checked
            var disabled = Convert.ToBoolean(cmd.ExecuteScalar());
            return disabled;
        }
    }
}

5.尽量不要把UI逻辑和数据库逻辑混在一起(它们通常放在不同的程序集中)

private void castVote(String favoriete)
{
    using (var connection = createConnection())
    {
        using (var cmd = new connection.CreateCommand())
        {
            cmd.CommandText = "UPDATE docent SET aantalStemmen = aantalStemmen + 1 where docentid = @id";
            cmd.Parameters.AddWithValue("@id", cmbFavoriete.Text);
            // command must be actually executed, otherwise nothing happens
            cmd.ExecuteNonQuery();
        }
    }
}

private void btnStem_Click(object sender, EventArgs e)
{
    string favoriet = cmbFavoriete.Text;

    bool r = isDisabled(favoriet);

    if (r) 
        castVote(favoriet);
        // maybe, it would make sense to also notify the user that the vote has been cast
    else
        MessageBox.Show("You have already voted.");
}

6.使用 EntityFramework - 为了避免与处理命令和 reader 相关的麻烦,您可以使用 ORM 为您完成脏工作。