这儿有一段代码,你参考一下:
private void btnLoad_Click(object sender, System.EventArgs e)
{
try 
{
// 创建一个新数据集来保存对主数据集所做的更改。
WindowsApplication1.DataSte1 objDataSetChanges = new WindowsApplication1.DataSte1();
// 停止当前的任何编辑。
this.BindingContext[objDataSet1,"表名"].EndCurrentEdit();
// 获取对主数据集所做的更改。
objDataSetChanges = ((WindowsApplication1.DataSte1)(objDataSte1.GetChanges()));
// 检查是否做了任何更改。
if ((objDataSetChanges != null)) 
{
try 
{
// 需要做一些更改,所以尝试通过调用 update 方法
// 和传递数据集以及任何参数来更新数据源。
this.UpdateDataSource(objDataSetChanges);
objDataSte1.Merge(objDataSetChanges);
objDataSte1.AcceptChanges();
}
catch (System.Exception eUpdate) 
{
// 在此处添加错误处理代码。
throw eUpdate;
}
// 添加代码以检查返回的数据集中是否有任何可能已被
// 推入到行对象错误中的错误。
}
}
catch (System.Exception eLoad) 
{
// 在此处添加错误处理代码。
// 显示错误信息(如果有)。
System.Windows.Forms.MessageBox.Show(eLoad.Message);
}}

解决方案 »

  1.   

    OleDbDataAdapter.Update(dataset);足够了!当然,要初始化好!
      

  2.   

    给你一段代码例子protected void Delete_record ( )

    DialogResult r = MessageBox.Show ( "是否删除当前记录!" , "删除当前记录!" , MessageBoxButtons.YesNo , MessageBoxIcon.Question ) ;
    int ss = ( int ) r ;
      if ( ss == 6 ) // 按动"确定"按钮
      { 
      try
      {

      string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = test.mdb " ;
      //OleDbConnection myConn = new OleDbConnection ( strCon ) ;
     // myConn.Open ( ) ;
    string strDele = "DELETE FROM 123 WHERE id= " + dataGrid1[myBind.Position,0].ToString() ;   
     
     
      // OleDbCommand myCommand = new OleDbCommand(strDele,myConn) ;
     

      
      
      try
      {
      OleDbConnection myCon = new OleDbConnection(strCon);
      OleDbCommand myCmd = new OleDbCommand(strDele, myCon);
      myCmd.Connection.Open();
      myCmd.ExecuteNonQuery();
     
      myCon.Close();     }
      catch(Exception exc)
      {
       MessageBox.Show(strDele);
         MessageBox.Show(exc.ToString());
      }
     
        
    //从数据库中删除指定记录

      //从DataSet中删除指定记录
      myDataSet.Tables [ "123" ] . Rows [ myBind.Position ] . Delete ( ) ;
      myDataSet.Tables [ "123" ] . AcceptChanges ( ) ;
      myAccessConn.Close ( ) ;
      }
      catch ( Exception ed )
      {
      MessageBox.Show ( "删除记录错误信息: " + ed.ToString ( ) , "错误!" ) ;
      } 
      }
    }
      

  3.   

    colinfly(Colin) 提到的:“OleDbDataAdapter.Update(dataset);足够了!当然,要初始化好!”
    if (dataset.HasChanges()) 
    {
    String sSQL ="select * from testtable "  ;

    OleDbCommand cm=new OleDbCommand(sSQL, adoconn.cn);
    OleDbDataAdapter reader = new OleDbDataAdapter(cm);
    reader.Update (dataset,"testtable");  //这句出现了"当传递具有已修改行的 DataRow 集合时,更新要求有效的 UpdateCommand。"
    MessageBox.Show ("更新完毕");
    }
    是否可以再具体些介绍一下。
    另外,也许不是我一个人遇到这个问题,但查阅了所有CSDN,C#和VB.net的论坛都没有人在这个问题上有清楚的回答!哎,难道真的没有高人~还是我水平太低!!!!,读不懂!
      

  4.   

    这个问题我前两天一直在研究,我是这样做的,希望大家共同探讨,更希望给我点分。
    大部分代码是照数据窗体向导生成的代码写的,只是把数据控件用手写代码代替,关键有几点。
    我用的是SQL。
    在生成数据表的时候,要用SqlCommandBuilder生成更新语句。
    在表中设定主键。
    另外我在填充dataset的时候,我用别的数据表名都出错,只有用“table”这个名好使,不知为什么。
    下面是源码。将数据绑定在datagrid上: strCon="Initial Catalog=test;Data Source=localhost;User ID=sa;Password=;Integrated Security=SSPI";
    myConn=new SqlConnection(strCon);
    myConn.Open();
        
    strsql="select * from aaa";
    //创建一个 DataSet
    mydataset=new DataSet();
    //用 sqlDataAdapter 得到一个数据集
    myCommand = new SqlCommand(strsql ,myConn) ;
    myDataAdapter=new SqlDataAdapter(myCommand);
    SqlCommandBuilder custCB = new SqlCommandBuilder(myDataAdapter);
    //把Dataset绑定table数据表
    myDataAdapter.Fill(mydataset,"Table");
    mydataset.Tables[0].PrimaryKey=new DataColumn[] {mydataset.Tables[0].Columns[mk]};
    //关闭此OleDbConnection
    dataGrid1.DataSource=mydataset.Tables[0];
    myCommand.Dispose();
    myConn.Close();更新部分代码: private void button1_Click(object sender, System.EventArgs e)
    {
    try 
    {
    // 尝试更新数据源。
    this.UpdateDataSet();
    }
    catch (System.Exception eUpdate) 
    {
    // 在此处添加错误处理代码。
    // 显示错误信息(如果有)。
    System.Windows.Forms.MessageBox.Show(eUpdate.Message);
    } }
    public void UpdateDataSet()
    {
    // 创建一个新数据集来保存对主数据集所做的更改。
    DataSet objDataSetChanges = new DataSet();
    // 停止当前的任何编辑。
    this.BindingContext[mydataset,"Table"].EndCurrentEdit();
    // 获取对主数据集所做的更改。
    objDataSetChanges = ((DataSet)(mydataset.GetChanges()));
    // 检查是否做了任何更改。
    if ((objDataSetChanges != null)) 
    {
    try 
    {
    // 需要做一些更改,所以尝试通过调用 update 方法
    // 和传递数据集以及任何参数来更新数据源。
    this.UpdateDataSource(objDataSetChanges);
    mydataset.Merge(objDataSetChanges);
    mydataset.AcceptChanges();
    }
    catch (System.Exception eUpdate) 
    {
    // 在此处添加错误处理代码。
    throw eUpdate;
    }
    // 添加代码以检查返回的数据集中是否有任何可能已被
    // 推入到行对象错误中的错误。
    } } public void UpdateDataSource(DataSet ChangedRows)
    {
    try 
    {
    // 在有挂起的更改时,只需要更新数据源即可。
    if ((ChangedRows != null)) 
    {
    // 打开连接。
    this.myConn.Open();
    // 尝试更新数据源。
    myDataAdapter.Update(ChangedRows);
    }
    }
    catch (System.Exception updateException) 
    {
    // 在此处添加错误处理代码。
    throw updateException;
    }
    finally 
    {
    // 无论是否引发了异常都关闭连接。
    this.myConn.Close();
    }
    }
      

  5.   

    你的UpdateCommand命令无效,首先你需要生成这个命令,如果你的dataAdapter是自动生成的,那么如果出现该提示,是因为自动生成的dataAdapter.UpdateCommand无法更新你的数据库,你需要手动更改该命令的sql语句
      

  6.   

    if (dataset.HasChanges()) 
    {
    String sSQL ="select * from testtable "  ;
    OleDbCommand cm=new OleDbCommand(sSQL, adoconn.cn);
    OleDbDataAdapter reader = new OleDbDataAdapter(cm);
    OleDbCommandBuilder cb = new OleDbCommandBuilder(reader);  //关键一句(终于查清楚,还要这么一句,不知是为什么呢,先能更新再说!!值得再讨论一下!!)
    reader.Update (dataset,"客户表");
    MessageBox.Show ("更新完毕");
    }
      

  7.   

    出现所述错误的原因是,你没有提供dataadapter.UpdateCommand命令,或是自动生成的命令无法有效的更新数据库字段,可能是你没有提供足够的信息之类的,请重写该命令。从你的程序来看,应该是你没有提供该命令,请使用commandBuilder 或直接写sql语句吧
      

  8.   

    感谢您使用微软产品。问题主要是关于OleDbCommandBuilder (SqlCommandBuilder)的使用上。如果DataGrid绑定到单一的数据表,这样就可以使用OleDbCommandBuilder (SqlCommandBuilder)来自动生成DataAdapter的DeleteCommand, InsertCommand和UpdateCommand等命令。但是,需要绑定到DataGrid的数据表设定Primary Key。
    下面提供一个简单的示例程序,供您参考:
    private OleDbCommandBuilder FriendsCmdBuilder; //用于自动生成SQL指令
    private DataSet FriendsDataSet= new DataSet(); 
    private OleDbDataAdapter  FriendsAdapter;  
    ……
    // 通过GridBind,将数据表Friends绑定到DataGrid1
    private void GridBind()
    {
    String ConnStr="Provider=SQLOLEDB;server=SHA-RICKIE-01;uid=user;pwd=user;database=test";
    OleDbConnection myConnection= new OleDbConnection(ConnStr);
    FriendsAdapter = new OleDbDataAdapter("select * from friends",myConnection);
    /// 实例化OleDbCommandBuilder
    FriendsCmdBuilder = new OleDbCommandBuilder(FriendsAdapter);
    ///fill the dataset
    FriendsAdapter.Fill(FriendsDataSet, "Friends");
    ///set the dataset as a datasource for windows datagrid
    dataGrid1.SetDataBinding(FriendsDataSet,"Friends");
    } private void btnSave_Click(object sender, System.EventArgs e)
    {
    try
    {
    ///执行inserts,updates,deletes指令
    /// Without the OleDbCommandBuilder, this line would fail.
    FriendsAdapter.Update(FriendsDataSet,"Friends");
    }
    catch(Exception ex)
    {
    MessageBox.Show(ex.ToString());
    }
    }关于OleDbCommandBuilder的更详细信息,请参考MSDN:
    ms-help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfSystemDataOleDbOleDbCommandBuilderClassTopic.htm — 微软全球技术中心 VB支持中心本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款(http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。
    为了为您创建更好的讨论环境,请参加我们的用户满意度调查(http://support.microsoft.com/directory/worldwide/zh-cn/community/survey.asp?key=(S,49854782))。