在 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。注意可能的异常。 SQLException
是 not 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 为您完成脏工作。
我正在 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。注意可能的异常。 SQLException
是 not 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 为您完成脏工作。