LINQ中ExecuteCommand更新数据库后,VB.NET窗体TextBox无法刷新数据的问题
问题解决方案
问题根源
你直接通过ExecuteCommand执行原生SQL更新数据库,但LINQ to SQL的DataContext会缓存已加载的实体对象(比如你代码中的x),原生SQL操作不会自动同步这个本地缓存。你之前调用_context.Refresh(...)时没有指定要刷新的实体,所以缓存里的x还是旧值,绑定的TextBox自然显示旧数据。
有效解决方法
方法1:指定实体调用Refresh
执行完ExecuteCommand后,针对目标实体x调用Refresh,把数据库最新值同步到内存对象:
_context.ExecuteCommand("update tb_ExpList set exp_name = {0}, exp_desc = {1}, exp_limit = {2}, exp_type = {3} where Expl_id= {4}", TextBox8.Text, TextBox7.Text, TextBox4.Text, TextBox3.Text, x.Expl_id) ' 针对x实体执行刷新 _context.Refresh(Data.Linq.RefreshMode.OverwriteCurrentValues, x) ' 重新给TextBox赋值(绑定模式可自动更新,手动赋值更稳妥) TextBox8.Text = x.exp_name TextBox7.Text = x.exp_desc TextBox4.Text = x.exp_limit TextBox3.Text = x.exp_type
注意:这里把字符串拼接改成了参数化查询,避免SQL注入风险,这是必须的规范写法。
方法2:重新查询实体
执行完更新后,从数据库重新加载x对象,再赋值给TextBox:
_context.ExecuteCommand("update tb_ExpList set exp_name = {0}, exp_desc = {1}, exp_limit = {2}, exp_type = {3} where Expl_id= {4}", TextBox8.Text, TextBox7.Text, TextBox4.Text, TextBox3.Text, x.Expl_id) ' 重新查询最新的实体 x = _context.tb_ExpList.SingleOrDefault(Function(e) e.Expl_id = x.Expl_id) ' 赋值给TextBox If x IsNot Nothing Then TextBox8.Text = x.exp_name TextBox7.Text = x.exp_desc TextBox4.Text = x.exp_limit TextBox3.Text = x.exp_type End If
方法3:改用LINQ to SQL实体更新(推荐)
放弃原生SQL,直接操作实体对象后提交更改,这样DataContext会自动同步缓存,无需额外刷新:
' 直接修改实体属性 x.exp_name = TextBox8.Text x.exp_desc = TextBox7.Text x.exp_limit = TextBox4.Text x.exp_type = TextBox3.Text ' 提交更改到数据库 _context.SubmitChanges() ' 此时x已经是最新值,TextBox如果是绑定状态会自动更新,也可手动赋值 TextBox8.Text = x.exp_name ' ...其他TextBox同理
内容的提问来源于stack exchange,提问作者ABDULAZIZ DHAW
相关产品推荐
相关产品推荐

