文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Linq中的更新

Linq中的更新

时间:2010-09-18  来源:桂素伟

最近在做一个小例子时,发现Linq To Sql一个问题,先描述一下场景。 应用数据库DataContext对象时,实例化了两上对象,一个对象来完成增,删,改,别一个对象来完成查询。 代码(代码是在Winform中完成的)如下:
public partial class Form2 : Form     {         public Form2()         {             InitializeComponent();         }         int id;         ComEntDataContext cedc = new ComEntDataContext();//查询数据库对象         ComEntDataContext cedc1 = new ComEntDataContext();//增删改数据库对象          //查询方法         private void button2_Click(object sender, EventArgs e)         {             //dataGridView1.DataSource = cedc.Users.Select(s => s);             dataGridView1.DataSource = cedc.Users;             cedc.Connection.Close();             listBox1.Items.Clear();             foreach (Users use in cedc.Users)             {                 listBox1.Items.Add(use.username);             }         }         //修改方法         private void button1_Click(object sender, EventArgs e)         {             try             {                 Users User = cedc1.Users.Single(user => user.ID == id);                 User.username = DateTime.Now.ToString("hhmmss");                 cedc1.SubmitChanges();             }             catch             { }         }          //添加方法         private void button3_Click(object sender, EventArgs e)         {             try             {                 Users use = new Users();                 use.username = "sss";                 use.userpw = "222";                 cedc1.Users.InsertOnSubmit(use);                 cedc1.SubmitChanges();             }             catch             { }         }         //删除方法         private void button4_Click(object sender, EventArgs e)         {             try             {                 Users User = cedc1.Users.Single(user => user.ID == id);                 cedc1.Users.DeleteOnSubmit(User);                 cedc1.SubmitChanges();             }             catch             { }         }         private void Form2_Load(object sender, EventArgs e)         {             dataGridView1.CellClick += new DataGridViewCellEventHandler(FF);         }         public void FF(object sender, DataGridViewCellEventArgs e)         {             if (e.RowIndex > -1)             {                 id = Convert.ToInt16(dataGridView1.Rows[e.RowIndex].Cells[0].Value);             }         }
}
代码dataGridView1.DataSource = cedc.Users;是用来绑定数据到datagridview上的,第一次绑定没有问题,如果我们执行了添加或删除后,再查询的时候就不起作用了。我们启用SQL的跟踪,会发现,每次点击查询时,是有sql语句提效的,增加,修改,删除代码后,再查询,依然能跟踪到有查询的执行,但查询的结果不变。
如果把红色代码//dataGridView1.DataSource = cedc.Users.Select(s => s);解除注释,会发现,情况有所改变,添加,删除的数据会在再次查询时能查到,但修改查询不到(数据库中的数据是发生了变化的)。
上面的两种情况,都至少说明一点,当再次查询,其实是执行了数据的查询,因为用SQL Server Profiler已经跟踪到了查询语句,只不过这种变化没有加载到显示控件上,应该在Linq To Sql内,封装了一个类似缓存的对象,来存放数据。即使修改了原数据,但这种状态没有触发缓存的修改(不知道在这里,微软是怎么封装的或思考的)。

为了解决这些所有的问题,只有在整个项目的处理中,定义一个数据库对象,来完成数据的处理,这样就能保持数据的一至性了。

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载