Datalist是用在前台绑定字段,后台
datalist1.DataBind();
然后在修改记录之后更新到数据库时先将数据保存在viewstate中(DataSet类型)
private bool SaveTempDataJK_Yi(string strViewStateIndex, params int[] index)
    {
        DataSet ds = (DataSet)this.ViewState["ds_base"];
        //循环datalist的每行
        for (int i = 0; i < this.DataListJK_Yi.Controls.Count; i++)
        {
            TextBox txtCH = (TextBox)this.DataListJK_Yi.Controls[i].FindControl("txtCH");
            TextBox txtYCZS = (TextBox)this.DataListJK_Yi.Controls[i].FindControl("txtYCZS");
            TextBox txtPZL = (TextBox)this.DataListJK_Yi.Controls[i].FindControl("txtPZL");
            /*......一些判断数据有效性的*/
            //cenghao列是主键列,判断该列数值有改动则修改viewstate中的dataset
            DataRow[] modifiedRow = ds.Tables[0].Select("cenghao='" + txtCH.Text.Trim() + "'");            if (modifiedRow[0]["sjzsl"].ToString().Trim() != txtSJZSL.Text.Trim())
            {
                modifiedRow[0]["sjzsl"] = txtSJZSL.Text.Trim();
            }
            if (modifiedRow[0]["szzj"].ToString().Trim() != txtSZZJ.Text.Trim())
            {
                modifiedRow[0]["szzj"] = txtSZZJ.Text.Trim();
            }
        }        return true;
    }
    protected void btnSaveToDB_Base_Click(object sender, ImageClickEventArgs e)
    {
         try
        {
            if (SaveTempData_Base("ds_base"))
            {
                #region 判断输入是否有效
                //数据库连接
                System.Data.SqlClient.SqlConnection myConn = new System.Data.SqlClient.SqlConnection(
                        ConfigurationManager.ConnectionStrings["ydyjjlConnectionString"].ConnectionString);
                  //取得yczsh的值,famc和cenghao是该表的主键
                string sqlDCYL = "select yczsh from des_fanganfcsj where famc='" + Session["famc"].ToString() + "' and cenghao='" +
                    ((TextBox)this.DataList_Base.Items[0].FindControl("txtCH")).Text.Trim() + "'";
                DataSet dsYCZS = new DataSet();
                SqlDataAdapter daYCZS = new SqlDataAdapter(sqlDCYL, myConn);
                //填充dataset
                daYCZS.Fill(dsYCZS);
                //判断数据有效的公式
                double DCYLPD = 0d;
                if (dsYCZS.Tables[0].Rows.Count != 0)
                {
                    DCYLPD = 0.5 * double.Parse(dsYCZS.Tables[0].Rows[0][0].ToString().Trim()) / 100;
                }
                if (txtDCYL.Text.Trim() != string.Empty && double.Parse(txtDCYL.Text.Trim()) < DCYLPD)//txtDCYL为输入值的控件
                {
                    lblErrors.Visible = true;
                    lblErrors.Text = "数据输入错误!";
                    return;
                }
                #endregion                
                if (((DataSet)this.ViewState["ds_base"]).GetChanges() != null)
                {
                    SqlDataAdapter da = new SqlDataAdapter("select  * from des_fanganfcsj where 1<>1", myConn);
                    DataSet ds = new DataSet();
                    da.Fill(ds);
                    //将viewstate合并到ds中,ds是des_fanganfcsj表的结构
                    ds.Merge((DataSet)this.ViewState["ds_base"]);
                    
                    SqlCommandBuilder sqlBuild = new SqlCommandBuilder(da);
                    //更新库
                    da.Update(ds);
                    ds.AcceptChanges();
                    this.ViewState["ds_base"] = ds;
                }
            }
            else
            {
                return;
            }            this.lblErrors.Text = "保存成功!";
        }
        catch
        {            this.lblErrors.Text = "保存失败!";
            return;
        }
    }
就在执行到da.Update(ds)这个的时候出现错误:"违反并发性: UpdateCommand 影响了预期 1 条记录中的 0 条。"
异常详细信息:
捕捉到 System.Data.DBConcurrencyException
  Message="违反并发性: UpdateCommand 影响了预期 1 条记录中的 0 条。"
  Source="System.Data"
  RowCount=1
  StackTrace:
       在 System.Data.Common.DbDataAdapter.UpdatedRowStatusErrors(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
       在 System.Data.Common.DbDataAdapter.UpdatedRowStatus(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
       在 System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows, DataTableMapping tableMapping)
       在 System.Data.Common.DbDataAdapter.UpdateFromDataTable(DataTable dataTable, DataTableMapping tableMapping)
       在 System.Data.Common.DbDataAdapter.Update(DataSet dataSet, String srcTable)
       在 System.Data.Common.DbDataAdapter.Update(DataSet dataSet)
       在 Content_MyFangAn_Content_sztp_fanganceshishuju.btnSaveToDB_Base_Click(Object sender, ImageClickEventArgs e) 位置 f:\Project Developing\cs_To_bs\BS\Content\MyFangAn_Content_sztp_fanganceshishuju.aspx.cs:行号 725

解决方案 »

  1.   

    参考:http://forums.microsoft.com/china/ShowPost.aspx?PostID=3772427&SiteID=15
      

  2.   

    你的这个连接没用,我的是在da.Update(ds)的时候出错的,而且我在update之后更新了。
      

  3.   

    说明:des_fanganfcsj 表和其他表有关联
      

  4.   

    this.ViewState["ds_base"]的表结构怎么样?
    应该是这个表结构的关系。
    另外,updatecommand默认更新所有字段的值
      

  5.   

    this.ViewState["ds_base"]的表结构怎么样?
    应该是这个表结构的关系。
    另外,updatecommand默认更新所有字段的值
      

  6.   

    因为你的条件也是递增的,所以会遇到这个问题,你可以用一下代码的方式: 
    for(int i=0;i<300;i++){
         int index = i;
         if(i==299)
         {
             index = 0;
         }
         dataset.Tables[0].Rows[index].BeginEdit();
         dataset.Tables[0].Rows[index]["Userid"] = i;
         dataset.Tables[0].Rows[index]["UserName"] = "Name" + i.ToString();
         dataset.Tables[0].Rows[index].EndEdit();
     }
     sd.Update(dataset.Tables[0]);当你要更新300数据的时候,你可以在299条记录的时候,把信息替换成不可能符合的条件(如UserID=0)上边的代码我运行过了,是可以的,希望可以给楼主一些参考,呵呵,还要记得给我点分,我五分都不到了。
      

  7.   

    将DbCommandBuilder.ConflictOption 属性设置为OverwriteChanges可使生成的Update和Delete语句仅包含主键。