我想在桌面上添加电器细节。 那我想检查一下电器是否已经存在。如果已经存在则给出错误消息,而不是向表中插入数据。
private void button4_Click(object sender, EventArgs e)
{
if (textBox4.Text != "" & textBox5.Text != "" & textBox13.Text != "" & dateTimePicker1.Text != "")
{
con.Open();
if(textBox13.Text == "Fan")
{
cmd.CommandText = "select * from Appliance_Location where Appliance_Id = '" + textBox4.Text + "'";
cmd.Connection = con;
//con.Open();
cmd.ExecuteNonQuery();
dr = cmd.ExecuteReader();
if (dr.HasRows)
{
MessageBox.Show("Already Exist", "Error Occured", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
cmd.CommandText = "insert into Appliance_Location(Appliance_Id, RoomId,ApplianceName,AddDate) values ('" + textBox4.Text + "' ,'" + textBox5.Text + "','" + textBox13.Text + "', '" + dateTimePicker1.Text + "');Update Appliance_Count set Fan = Fan + 1 where RoomId = '" + textBox5.Text + "' ";
// cmd.ExecuteNonQuery();
cmd.Clone();
MessageBox.Show("New Fan added !", "Add Appliance", MessageBoxButtons.OK, MessageBoxIcon.Information);
con.Close();
textBox4.Text = "";
textBox5.Text = "";
textBox13.Text = "";
dateTimePicker1.Text = "";
}
//loadtable();
}
}
我刚试过这段代码。但是数据没有插入表中。
答案 0 :(得分:3)
你为什么打电话给SqlCommand.Clone()
?您实际上并没有执行查询,只是打开和关闭连接。
您已经注释掉了需要执行的代码行:
cmd.ExecuteNonQuery();
如果没有实际执行查询,您实际上什么都不做(没有数据修改)。
修改强>
根据您的评论,您收到的错误是已有一个开放式数据阅读器。您需要致电SqlDataReader.Close()
来解决该问题。
但使用数据读取器没有真正的理由来测试数据是否存在(以确定是否需要插入行)。只需改为select count(*) ...
:
cmd.CommandText = "select count(*) from Appliance_Location where Appliance_Id = '" + textBox4.Text + "'";
cmd.Connection = con;
con.Open();
int rowCount = (int)cmd.ExecuteScalar();
if (rowCount == 0)
{
MessageBox.Show("Already Exist", "Error Occured", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
你让自己对最常见的黑客/攻击形式持开放态度:SQL注入
您需要参数化SQL查询以防止SQL注入:
cmd.CommandText = "select count(*) from Appliance_Location where Appliance_Id = @ApplicationId;";
cmd.Parameters.Add(new SqlParameter("@ApplicationId", SqlDbType.VarChar, 32) { Value = textBox4.Text });
上述代码假设您的ApplicationId
列的类型为varchar(32)
,但请进行适当调整。