如何在C#中检查表中的字段是否已经存在?

时间:2015-07-29 17:53:57

标签: c#

我想在桌面上添加电器细节。 那我想检查一下电器是否已经存在。如果已经存在则给出错误消息,而不是向表中插入数据。

    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();
        }
     }

我刚试过这段代码。但是数据没有插入表中。

enter image description here

1 个答案:

答案 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),但请进行适当调整。