当我点击datagridview的单元格时,我想更新我的数据库,实际上我想通过单击一个单元格来编辑我的数据库和datagridview。
我的数据库中有一个id,它自动填充,当我插入并保存s.th时,我需要用我的sql填充id。并且我的代码不起作用:
代码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();
}
答案 0 :(得分:0)
简单回答
DataGridView.Enter
仅在DataGridView
获得焦点并被输入时触发;当你进入一个新的细胞时。此外,在您已经输入单元格之后,还没有进行更改。最后,您的更新可能会失败,因为where id = @id
在您认为不应该评估True
时。更深入的解释
假设您有以下数据库设置:
+---+-------+--------+-----------+----------+
|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
:
现在假设我们拼错了约翰史密斯的名字,而该名字应该是 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
添加到语句中,因为它应该是数据库中的标识列,并且将自动生成。