SqlCommandBuilder 批量更新数据库的怪异问题?

来源:互联网 发布:上海linux招聘 编辑:程序博客网 时间:2024/05/16 06:10

昨天在一直使用SqlCommandBuilder批量更新数据库时,老是不成功,代码如下:

其中btShow是一个按纽(直接在窗体上)

其中btSave是一个在bindingNavigator上自已添加的按纽(后来发现问题就出现在它身上)   

        private IAdapter ada = new SqlAdapter();
        
private SqlDataAdapter da;
        
private DataSet ds;            

 
private void btShow_Click(object sender, EventArgs e)
        
{           

            da 
= ada.adapter("SELECT * FROM late");
            
if (da != null)
            
{
                ds 
= new DataSet();
                da.Fill(ds);

                bindingSource1.DataSource 
= ds.Tables[0];
                bindingNavigator1.BindingSource 
= bindingSource1;
                dataGridView1.DataSource 
= bindingSource1;

          }


}
        

private void toolSave_Click(object sender, EventArgs e)
        
{
                SqlCommandBuilder scb 
= new SqlCommandBuilder(da);
                da.Update(ds);
//更新数据库
        }

 

以上代码总是不能更新数据库

通过跟踪发现当更改一个datagridview中的单元格时,且焦点还在这个单元格时ds.HasChanges()方法始为false,

但是toolSave事件照样执行,因为没有发生任何更改,所以不向数据库发送更新命令(ds.Update(ds)也会执行),这时把数据库暂停也不会出现异常.

当更改了一个单格的值后,并让它失去焦点,比如让它下一个单元格处于编辑时,ds.HasChanges()才会为true,此时会更新数据库.

但是是窗体上的按纽,则上面的代码不管有没有失去焦点都能成功更新.

解决方法:

在toolSave更改为下面代码就可以正确更新了:

 

  private void toolSave_Click(object sender, EventArgs e)
        
{           
            dataGridView1.EditMode 
= DataGridViewEditMode.EditOnEnter;//另有很多朋友问,怎样把焦点定位到指定单元格并处于编辑状态,这条语句就是关键了.
            dataGridView1.CurrentCell 
= dataGridView1.Rows[0].Cells[0];//把焦点定位到第一列第一行,不知道有没有更好的方法
            if (ds.HasChanges())
            
{
                SqlCommandBuilder scb 
= new SqlCommandBuilder(da);
                da.Update(ds);
            }

 

 

希望对您有用.

原创粉丝点击