我的代码如下
    
private void menuItem2_Click(object sender, System.EventArgs e)
{   
    DataColumnCollection  dcc=ds.Tables[0].Columns;
DataColumn dc=dcc[0];
DataColumn[] mydc={dc};
ds.Tables[0].PrimaryKey=mydc;
string c=dc.ToString();
    int s=Convert.ToInt32(dataGrid1[dataGrid1.CurrentRowIndex,0]);
MessageBox.Show(s.ToString());
DataRow myrow= ds.Tables[0].Rows.Find(s);
ds.Tables[0].Rows.Remove(myrow);
dataGrid1.Refresh();
    string constr=da.getconnstr();
    SqlConnection conn= new SqlConnection(constr);
SqlDataAdapter Da=new SqlDataAdapter (sql,conn);
SqlCommandBuilder cb=new SqlCommandBuilder(Da);
conn.Open();
Da.Update(ds,c);
ds.AcceptChanges(); }
大家伙帮我怎么改 我是要将dataset中的数据通过DataAdapter更新到数据库中 
未处理的“System.InvalidOperationException”类型的异常出现在 system.data.dll 中。其他信息: Update 无法找到 TableMapping['identity'] 或 DataTable“identity”。

解决方案 »

  1.   

    看看你在邦定dataGrid1的时候,有没有把表中的主键邦到上面上去了呢。
      

  2.   

    数据库设了主键了啊 就是那个identity
    楼上说的怎么绑 datset不是自动获得吗 
    绑到dataGrid上没有用啊
      

  3.   

    找不到你的表啊 identity
    Da.Update(ds,ds.Tables[0].TableName); 
      

  4.   

    public void DeletfromDataRow()
    {
    DataColumnCollection  dcc=ds.Tables[0].Columns;//取得table的列
    DataColumn dc=dcc[0];//第一列
    DataColumn[] mydc={dc};//转换为可用格式
    ds.Tables[0].PrimaryKey=mydc;//主键
    string c=dc.ToString();
    int s=Convert.ToInt32(dataGrid1[dataGrid1.CurrentRowIndex,0]);//dataGrid的列序号也就是主键的值
    //MessageBox.Show(s.ToString());
    DataRow myrow= ds.Tables[0].Rows.Find(s);//找到对应的行
    ds.Tables[0].Rows.Remove(myrow);//在dataset中删除该行
    dataGrid1.Refresh();//更新dataGrid
    }
    private void menuItem2_Click(object sender, System.EventArgs e)
    {   
        DeletfromDataRow();
        string constr=da.getconnstr();//da为全局变量 是另外一个类的实例
        SqlConnection conn= new SqlConnection(constr);
    conn.Open();
    SqlDataAdapter Da=new SqlDataAdapter (sql,conn);
    SqlCommandBuilder cb=new SqlCommandBuilder(Da);
    Da.SelectCommand   =  cb.GetInsertCommand(); 
    Da.UpdateCommand   =  cb.GetUpdateCommand(); 
    Da.DeleteCommand   =  cb.GetDeleteCommand(); 
    DataSet dsChanges = ds.GetChanges();
    if (dsChanges != null)
    {
    Da.Update(dsChanges );
    ds.AcceptChanges();
    }

    }
      

  5.   

    现在我要做的是针对很多表的通用程序 不这样怎么做呢 只有这样不用写SQL语句
    可以把dataGrid中也就是dataSet中的更新反映在数据库中
      

  6.   


            //update Player set plaName='1254'这个你自己找找,好象有可以对饮DataSet所有列的更新,忘记了,我这个是写死了的
            SqlDataAdapter sq;
            DataSet ds;
            SqlConnection sqlcon;
            private void buttonTest_Click(object sender, EventArgs e)
            {
                ds = new DataSet("Freedom");
                sqlcon = new SqlConnection("server=127.0.0.1;database=Freedom;uid=sa;pwd=");
                sqlcon.Open();
                SqlCommand sql = new SqlCommand("select * from Player", sqlcon);
                sq = new SqlDataAdapter();
                sq.SelectCommand=sql;
                sq.Fill(ds, "Player");
                dataGrid1.DataSource = ds.Tables["Player"];
            }        private void button1_Click(object sender, EventArgs e)
            {
                SqlCommandBuilder sqlcom = new SqlCommandBuilder(sq);
                sq.UpdateCommand = new SqlCommand("update Player set plaName='1254'", sqlcon);
                sq.Update(ds, ds.Tables[0].TableName);
            }
      

  7.   

    public void ExcuteData(DataSet ds,string sql,string tablename)
    {
    SqlDataAdapter sda=new SqlDataAdapter(sql,"server=.;database=***;integrated security=SSPI");
    SqlCommandBuilder scb=new SqlCommandBuilder (sda);
    sda.update(ds,tablename);
    sda.selectcommand.connection.close();
    }
    写个这样的数据操作方法,专门来修改DATASET中的数据,参数sql需要和原来进行查询数据时的select 语句,一般要包含所有的列 
    另外,在C#中为该表创建主键是没用的,如果使用SqlCommandBuilder 进行重构,则SqlDataAdapter 进行数据操作的那个表必须在数据库中带上主键
      

  8.   

    还有一点说明的,传到方法中要修改的数据的DATASET是已经修改后的,并且传到方法中之前不能调用ds.AcceptChanges(); 
      

  9.   

    使用dataAdapter.update()方法需要满足两个条件:
    1、表要有主键;
    2、selectcommand的语句中需要包含表的主键字段;
    3、调用dataAdapter.update()方法前,保证datatable的datarow状态不是unchanged。
      

  10.   

    13楼的方法不行啊 我这样改了     string constr=da.getconnstr();//da为全局变量 是另外一个类的实例
        SqlConnection conn= new SqlConnection(constr);
    conn.Open();
    SqlDataAdapter Da=new SqlDataAdapter ();
    Da.SelectCommand=new SqlCommand(sql,conn);
    SqlCommandBuilder cb=new SqlCommandBuilder(Da);
    // Da.SelectCommand   =  cb.GetInsertCommand(); 
    // Da.UpdateCommand   =  cb.GetUpdateCommand(); 
    // Da.DeleteCommand   =  cb.GetDeleteCommand(); 
    DataSet dsChanges = ds.GetChanges();
    if (dsChanges != null)
    {
    Da.Update(dsChanges,tablename);
    ds.AcceptChanges();
    }
    还是不行 这次是系统错误意思是
    system.data中的错误,我的主键是SQL自动生成的序号
      

  11.   

    未处理的“System.Data.SqlClient.SqlException”类型的异常出现在 system.data.dll
      

  12.   

    晕!
    这样做啊.比如你在LOAD事件里加载数据.
    //定义一个全局的
    DataSet ds=new DataSet();
    private void Load(object sender,EventArgs e)
    {
    ds=new DataSet();
    SqlDataAdapter sda=new SqlDataAdapter("SELECT * FROM MYtable","server=.;database=***;integrated security=SSPI"); 
    sda.Fill(ds,tablename); 
    sda.selectcommand.connection.close(); 
    }
    然后你在操作数据.无论在那里操作数据通过DataGrid直接操作或者通过Button进行增/删/改都不能调用ds.AccpChangs()只对ds中的表进行操作
    完了点击菜单在private void menuItem2_Click中调用下面方法
    private void menuItem2_Click(object sender, System.EventArgs e) 
    {
    string sql="SELECT * FROM MYTABLE";
    ExcuteData(ds,sql,"MYtable");
    }
    public void ExcuteData(DataSet ds,string sql,string tablename) 

    SqlDataAdapter sda=new SqlDataAdapter(sql,"server=.;database=***;integrated security=SSPI"); 
    SqlCommandBuilder scb=new SqlCommandBuilder (sda); 
    sda.update(ds,tablename); 
    sda.selectcommand.connection.close(); 
    }
    MYtable这个表一定 要在数据库中建立了主键
      

  13.   

    感谢上面的回答 我自己解决了 使用了一个网上找的方法(谢谢提供方法的朋友 我私自用了嘿嘿)
    方法如下#region //更新数据库
    public DataSet UpdateByDataSet(DataSet ds,string strTblName,string strConnection)
    {
       
      
    SqlConnection  conn = new SqlConnection(strConnection);         
    SqlCommand myCommand = new SqlCommand("select * from "+strTblName+"",conn);     SqlDataAdapter myAdapter = new SqlDataAdapter(myCommand );    SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);     
    myAdapter.InsertCommand = myCommandBuilder .GetInsertCommand();
    myAdapter.UpdateCommand = myCommandBuilder .GetUpdateCommand();
    myAdapter.DeleteCommand = myCommandBuilder .GetDeleteCommand();
    try
    {
    conn.Open(); myAdapter.Update(ds,strTblName);   conn.Close();

    }//数据集的行状态在更新后会都变为: UnChange,在这次更新后客户端要用返回的ds }

    catch(Exception ex)
    {
    MessageBox.Show(ex.ToString());
    }
    return ds;  
    } #endregion
    我写在数据库操作类中了 大家要用还得改下
    分数我看看能不能大家分了