使用datagridview更新DB输入事件

时间:2015-07-14 05:11:25

标签: c# datagridview

  1. 当我点击datagridview的单元格时,我想更新我的数据库,实际上我想通过单击一个单元格来编辑我的数据库和datagridview。

  2. 我的数据库中有一个id,它自动填充,当我插入并保存s.th时,我需要用我的sql填充id。并且我的代码不起作用:

  3. 代码1。

         private void dgvlist_Enter(object sender, EventArgs e)
       {
           SqlConnection con = new SqlConnection();
           SqlCommand cmd = new SqlCommand();
           SqlDataAdapter da = new SqlDataAdapter();
           con.ConnectionString = "server=(local);database=tel;trusted_connection=yes;";
           con.Open();
           cmd.Connection = con;
           da.SelectCommand = cmd;
           DataGridViewCell cell = dgvlist.SelectedCells[0] as DataGridViewCell;
           string value = cell.Value.ToString();
           cmd.CommandText = ("update information set name =@name , family=@family , telephone=@telephone , mobile = @mobile where id = @id");
           cmd.Parameters.AddWithValue("@id", value);
           cmd.Parameters.AddWithValue("@name", value);
           cmd.Parameters.AddWithValue("@family", value);
           cmd.Parameters.AddWithValue("@telephone", value);
           cmd.Parameters.AddWithValue("@mobile",  value);
           cmd.ExecuteNonQuery();
       }
    

    代码2。

        private void btnsave_Click(object sender, EventArgs e)
        {
            if (txtname.Text == null || txtfamily.Text == null || txttel.Text == null)
            {
                MessageBox.Show("please fill the neccessary boxes");
            }
            else
            {
                save();
            }
        }
        void save()
        {
            SqlConnection con = new SqlConnection();
            SqlCommand cmd = new SqlCommand();
            SqlDataAdapter da = new SqlDataAdapter();
            con.ConnectionString = "server=(local);database=tel;trusted_connection=yes;";
            con.Open();
            cmd.Connection = con;
            da.SelectCommand = cmd;
            cmd.CommandText = ("insert into information id = @id , name =@name , family=@family , telephone=@telephone , mobile = @mobile where id = @id");
            cmd.Parameters.AddWithValue("@id", "");
            cmd.Parameters.AddWithValue("@name", txtname.Text);
            cmd.Parameters.AddWithValue("@family", txtfamily.Text);
            cmd.Parameters.AddWithValue("@telephone", txttel.Text);
            cmd.Parameters.AddWithValue("@mobile", txtmobile.Text);
            cmd.ExecuteNonQuery();
        }
    

1 个答案:

答案 0 :(得分:0)

简单回答

  1. DataGridView.Enter仅在DataGridView获得焦点并被输入时触发;当你进入一个新的细胞时。此外,在您已经输入单元格之后,还没有进行更改。最后,您的更新可能会失败,因为where id = @id在您认为不应该评估True时。
  2. 您的sql Insert语句格式不正确,因为错误指出:“语法错误”。
  3. 更深入的解释

    假设您有以下数据库设置:

    +---+-------+--------+-----------+----------+
    |id | name  | family | telephone | mobile   |
    +---+-------+--------+-----------+----------+
    |1  | John  | Smith  | 123-4567  | 123-4560 |
    |2  | Jane  | Doe    | 987-6543  | 987-6540 |
    |3  | Jenny | Tutone | 867-5309  | 867-5309 |
    +---+-------+--------+-----------+----------+
    

    结果DataGridView

    DataGridView Image containing equivalent data to mocked database

    现在假设我们拼错了约翰史密斯的名字,而该名字应该是 Jon 。假设某些其他控件当时具有焦点,则单击第0行第1列中的单元格 - 现在触发您的方法(进行任何更改之前):

        DataGridViewCell cell = dgvlist.SelectedCells[0] as DataGridViewCell;
        string value = cell.Value.ToString();
        cmd.CommandText = ("update information set name =@name , family=@family , telephone=@telephone , mobile = @mobile where id = @id");
        cmd.Parameters.AddWithValue("@id", value);
        cmd.Parameters.AddWithValue("@name", value);
        cmd.Parameters.AddWithValue("@family", value);
        cmd.Parameters.AddWithValue("@telephone", value);
        cmd.Parameters.AddWithValue("@mobile",  value);
    

    实际上,正在运行的查询是:

    update information set name ='John' , family='John' , telephone='John' , mobile = 'John' where id = 'John'
    

    由于没有记录where id = 'John',因此不会更新任何记录。另一方面,如果您首先单击第0行第0列中的单元格,您的查询看起来会很受欢迎:

    update information set name ='1' , family='1' , telephone='1' , mobile = '1' where id = '1'
    

    这将导致以下数据库更改:

    +---+-------+--------+-----------+----------+
    |id | name  | family | telephone | mobile   |
    +---+-------+--------+-----------+----------+
    |1  | 1     | 1      | 1         | 1        |
    |2  | Jane  | Doe    | 987-6543  | 987-6540 |
    |3  | Jenny | Tutone | 867-5309  | 867-5309 |
    +---+-------+--------+-----------+----------+
    

    因此,您需要修复在命令参数中设置的值。然后,您应该考虑将此更新代码移动到其他方法,例如DataGridView.CellEndEdit,以便在当前单元格中进行任何更改后更新它。

    至于你的插入声明,一个简单的谷歌搜索会显示正确的格式。更改以下内容:

    cmd.CommandText = ("insert into information id = @id , name =@name , family=@family , telephone=@telephone , mobile = @mobile where id = @id");
    

    以下内容:

    cmd.CommandText = ("insert into information (name, family, telephone, mobile) values (@name, @family, @telephone, @mobile)");
    

    不需要将id添加到语句中,因为它应该是数据库中的标识列,并且将自动生成。