解决方案 »

  1.   

    当插入更新数据时提示  当传递具有新行的 DataRow 集合时,更新要求有效的 InsertCommand。
      

  2.   

    你需要判断表里哪些是新行,对应执行insert
    否则数据库中没有相应记录,你往哪里UPDATE
      

  3.   

     da.Update(ds, table);  估计 有些行是新增,有些行是修改。
      

  4.   


    我这是从批量修改datagridview 后返回来的Dataset  我怎么判断哪些数据是修改后的 哪些是新行 和删除的
      

  5.   


    是的 我现在不知道怎么判断哪些是新行 哪些是删除行 
    循环DataSet中某表的所有行,添加如下的判断  
                dr.RowState == DataRowState.Added;   // 新增
                dr.RowState == DataRowState.Modified;  // 修改
      

  6.   


    是的 我现在不知道怎么判断哪些是新行 哪些是删除行 
    循环DataSet中某表的所有行,添加如下的判断  
                dr.RowState == DataRowState.Added;   // 新增
                dr.RowState == DataRowState.Modified;  // 修改

    正解.
    你原来的代码就应该判断数据有修改才提交,而不是不管数据有没有修改都提交所有数据
    如果数据有1万行,我只修改了1行,你提交10000次?那执行效率多慢.
      

  7.   

    不单独定义myCommand,使用SqlDataAdapter重载方法赋值SELECT命令,并指定myAdapter.InsertCommand = SCB.GetInsertCommand();,详细见下面的代码和注释 SqlConnection con = GetCon();
    if (con.State.Equals(ConnectionState.Closed))
    {
    con.Open();
    }
    SqlDataAdapter myAdapter = new SqlDataAdapter("SELECT * FROM " + table, con);
    //直接使用上面的myAdapter重载方法赋值SELECT命令,所以注释下面两行
    //SqlCommand myCommand = new SqlCommand("SELECT * FROM " + table, con);
    //myAdapter.SelectCommand = myCommand; SqlTransaction myTrans = con.BeginTransaction();//添加一个事务
    //因为没有新建myCommand,而使用myAdapter.SelectCommand,所以注释并替换下面一行
    //myCommand.Transaction = myTrans;
    myAdapter.SelectCommand.Transaction = myTrans;
    SqlCommandBuilder SCB = new SqlCommandBuilder(myAdapter);
    //添加下面两行来指定UpdateCommand和InsertCommand命令
    myAdapter.UpdateCommand = SCB.GetUpdateCommand();
    myAdapter.InsertCommand = SCB.GetInsertCommand();

    myAdapter.Fill(ds, table); try
    {
    myAdapter.Update(ds, table);
    ds.AcceptChanges();
    myTrans.Commit();                           //事务正常提交
    return true;
    }
    catch (SqlException ex)
    {
    try
    {
    myTrans.Rollback();                                 //事务回滚
    throw new Exception("SQL数据库连接失败,操作数据库产生错误: " + ex.Message);
    }
    catch (SqlException ey)                                 //回滚失败
    {
    if (myTrans.Connection != null)
    {
    throw new Exception("数据回滚事务遇到一个异常类型 : " + ey.GetType());
    }

    }
    return false;
    }
    finally
    {
    con.Close();
    }
      

  8.   

    我设置了主键为什么还是提示还是不行。 下面是我做的按钮事件 麻烦帮我分析一下问题出在哪里 private void r_保存_Click(object sender, EventArgs e)
            {
                if (MessageBox.Show("确认保存吗 ", "提示", MessageBoxButtons.OKCancel) == DialogResult.OK)
                {
                    try
                    {
                        dt_table = mis.ExecSqlReturnDataTable("select * from qx_mk").Tables[0];  //查询修改前数据库中的表                    ds_users.Tables[0].PrimaryKey = new DataColumn[] { ds_users.Tables[0].Columns["id"] };//这里主键的列名
                        ds_users.Tables[0].Merge(dt_table);
                        ds_users.Tables[0].TableName = "qx_mk";
                       
                        if (mis.UpdateSqlReturn(ds_users, "qx_mk"))
                        {
                            MessageBox.Show("保存成功! ");
                        }
                        else
                        {
                            MessageBox.Show("保存出错! ");
                        }                }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                        return;
                    }                          }
            }
      

  9.   

    我说的主键是数据库表本身有主键,我想你应该有的。
    你的ds_users这个数据是什么?你需要批量获取很多数据,然后批量插入吗?不然是不是用table.Rows.Add(row);这样就可以添加到dt_table里面了,不用单独在通过ds_users.Tables[0]这样的方法来合并两个DataTable。
    还有你下面的代码和你第一次问题时候的代码完全不一样的吗?我阅读起来有点跳跃。
      

  10.   

    数据库表里的 “id” 列是主键 ds_users 是获取DataGridView 里批量插入修改后的数据集
    我把查询修改前的数据表 和合并的那两行注销了。仍然提示所说的问题。
    这个程序我是想通过批量插入修改 DatagridView 然后批量更新数据库中的表,这个问题困扰了我几天了。
      

  11.   

    给myAdapter添加一个增加的语句,例如:        System.Data.SqlClient.SqlDataAdapter myAdapter = new System.Data.SqlClient.SqlDataAdapter();
            System.Data.SqlClient.SqlCommand insertCommand =new System.Data.SqlClient.SqlCommand("insert into .....");
            myAdapter.InsertCommand = insertCommand;
    这样当表中有新增加的数据行时就自动执行这条语句了。
      

  12.   

    这样写还是报同样的错误 SqlConnection con = GetCon();
                    if (con.State.Equals(ConnectionState.Closed))
                    {
                        con.Open();
                    }
                    SqlDataAdapter myAdapter = new SqlDataAdapter("SELECT * FROM " + table, con);
                    SqlTransaction myTrans = con.BeginTransaction();//添加一个事务
                    myAdapter.SelectCommand.Transaction = myTrans;
                    SqlCommandBuilder SCB = new SqlCommandBuilder(myAdapter);                foreach (DataRow dr in ds.Tables[0].Rows)
                    {
                        if (dr.RowState == DataRowState.Added)
                        {
                            System.Data.SqlClient.SqlCommand insertCommand = new System.Data.SqlClient.SqlCommand();
                            insertCommand.CommandText = "insert into qx_mk(id,mkmc,zmkmc,gnmc,winmc,dwomc,wintype) values('" +dr["id"]
                                + "','" + dr["mkmc"] + "','" + dr["zmkmc"] + "','" + dr["gnmc"] + "','" + dr["winmc"] + "','" + dr["dwomc"] + "'," + dr["wintype"] + ")";
                            myAdapter.InsertCommand = insertCommand;
                        }
                    }
                    myAdapter.UpdateCommand = SCB.GetUpdateCommand();                
                    myAdapter.DeleteCommand = SCB.GetDeleteCommand();
                    myAdapter.Fill(ds,table);
                    try
                    {
                        MessageBox.Show(myAdapter.InsertCommand.CommandText.ToString());
                        //da.Update(ds, table);
                        //ds.AcceptChanges();
                        myTrans.Commit();                           //事务正常提交
                        return true;
                    }
                    catch (SqlException ex)
                    {
                        try
                        {
                            myTrans.Rollback();                                 //事务回滚
                            throw new Exception("SQL数据库连接失败,操作数据库产生错误: " + ex.Message);   
                        }
                        catch (SqlException ey)                                 //回滚失败
                        {
                            if (myTrans.Connection != null)
                            {
                                throw new Exception("数据回滚事务遇到一个异常类型 : " + ey.GetType());
                            }
                           
                        }
                            return false;
                    }
                    finally
                    {
                        con.Close();
                    }           
      

  13.   

    你这个写法有点混乱了。如果你是程序不是很大和设计商业机密,可以把这部分代码和数据库表的相关信息发QQ邮箱,191 327 0724去掉空格后加@qq.com,如果能调试好,再发回给你。