我正在使用带有C#的Windows窗体,我有一个gridview和4个texboxes和更新按钮,我想通过texbox更新所选行,我可以更改名称,大小,日期但我无法更改Id,我希望能够更改所有列。我怎么能这样做!!
private void Updatebtn_Click_1(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection(@"Data Source=Ali-pc\sqlexpress;Initial Catalog=DB;Integrated Security=True");
SqlCommand cmd = new SqlCommand("update stock set Id=@Id, Name= @Name, Size= @Size, Date=@Date where Id=@Id ", conn);
conn.Open();
cmd.Parameters.AddWithValue("@Id", textBox1.Text);
cmd.Parameters.AddWithValue("@Name", textBox2.Text);
cmd.Parameters.AddWithValue("@Size", textBox3.Text);
cmd.Parameters.AddWithValue("@Date", dateTimePicker1.Value);
cmd.ExecuteNonQuery();
MessageBox.Show("Successfully Changed ", "message", MessageBoxButtons.OK, MessageBoxIcon.Information);
DataTable ds = new DataTable();
SqlDataAdapter sda = new SqlDataAdapter("Select * from stock", conn);
sda.Fill(ds);
BindingSource bs = new BindingSource();
bs.DataSource = ds;
dataGridView1.DataSource = bs;
}
答案 0 :(得分:2)
仔细看看你的命令。
update ... set Id=@Id ... where Id=@Id
您尝试将您的Id列设置为已所具有的值。等;
update ... set Id=5 ... where Id=5
这就是为什么您的列值不会发生变化的原因。考虑更改您想要更改的值WHERE
部分。
还有一些事情;
using
statement自动处理您的连接,命令和适配器。Add
方法重载来指定参数类型及其大小。DATE
可能是reserved keyword。您可能希望将其用作[DATE]
。或者更好的是,将其更改为非未来保留字。答案 1 :(得分:1)
虽然更新主键并不是一个好主意,但在您需要的情况下,它就足够了:
@OriginalId
用于原始值,@NewId
用于更改值@OriginalId
,将新值分配给@NewId
"UPDATE stock SET Id=@NewId, Name= @Name, Size= @Size, Date=@Date WHERE Id=@OriginalId "