由于需要更新的表,数据量很大,通常是几百万条,我先取得该表的空记录DataSet,然后增加记录到dsUpdate.Tables[0],之后用sda.MissingSchemaAction = MissingSchemaAction.AddWithKey;
sda.Update(dsUpdate.Tables[0]);
dsUpdate.AcceptChanges();
进行更新到服务器,但每次更新到服务器之前,我必须先按主键删除已经存在的记录,然后才能更新,而删除操作也是特别费时,特别是没有记录的时候,各位高手,可有比较好的方法?

解决方案 »

  1.   

    http://blog.csdn.net/zhzuo/archive/2004/08/06/67037.aspx
    把UpdateCommand,InsertCommand写好就行了
    不使用存储过程,可以这么写:InsertCommandvoid bool InsertData(DataSet ds)
    {
                   String sqlStr;
    sqlStr="insert into myTable(CategoryName,ParentID,HasChild,Description) values (@CategoryName,@ParentID,@HasChild,@Description);select @PkID=@@identity";
    theInsertCommand  = new SqlCommand(sqlStr,new SqlConnection(ConstructionConfiguration.ConnectionString));
    SqlParameterCollection sqlParams = theInsertCommand.Parameters;
    sqlParams.Add(new SqlParameter( "@PkID",SqlDbType.Int));
    sqlParams.Add(new SqlParameter( "@CategoryName",SqlDbType.Char,50));
    sqlParams.Add(new SqlParameter( "@ParentID",SqlDbType.Int));
    sqlParams.Add(new SqlParameter( "@HasChild",SqlDbType.Char));
    sqlParams.Add(new SqlParameter( "@Description",SqlDbType.Char));
    //
    // Define the parameter mappings from the data table in the/
    // dataset.
    //
    sqlParams["@PkID"].SourceColumn=GoodsCategoryData.PKID_FIELD;
    sqlParams["@PkID"].Direction=ParameterDirection.Output;
    sqlParams["@CategoryName"].SourceColumn=GoodsCategoryData.CATEGORYNAME_FIELD;
    sqlParams["@ParentID"].SourceColumn=GoodsCategoryData.PARENTID_FIELD;
    sqlParams["@HasChild"].SourceColumn=GoodsCategoryData.HASCHILD_FIELD;
    sqlParams["@Description"].SourceColumn=GoodsCategoryData.DESCRIPTION_FIELD;
    SqlDataAdapter dsCommand;
    dsCommand.InsertCommand=theInsertCommand;
    dsCommand.Update(data,"MyTable"); //注意这个MyTable}
      

  2.   

    void bool InsertData(DataSet ds)
    {
                   String sqlStr;
    sqlStr="insert into myTable(CategoryName,ParentID,HasChild,Description) values (@CategoryName,@ParentID,@HasChild,@Description);select @PkID=@@identity";
    theInsertCommand  = new SqlCommand(sqlStr,new SqlConnection(ConstructionConfiguration.ConnectionString));
    SqlParameterCollection sqlParams = theInsertCommand.Parameters;
    sqlParams.Add(new SqlParameter( "@PkID",SqlDbType.Int));
    sqlParams.Add(new SqlParameter( "@CategoryName",SqlDbType.Char,50));
    sqlParams.Add(new SqlParameter( "@ParentID",SqlDbType.Int));
    sqlParams.Add(new SqlParameter( "@HasChild",SqlDbType.Char));
    sqlParams.Add(new SqlParameter( "@Description",SqlDbType.Char));
    sqlParams["@PkID"].SourceColumn=GoodsCategoryData.PKID_FIELD;
    sqlParams["@PkID"].Direction=ParameterDirection.Output;
    sqlParams["@CategoryName"].SourceColumn=GoodsCategoryData.CATEGORYNAME_FIELD;
    sqlParams["@ParentID"].SourceColumn=GoodsCategoryData.PARENTID_FIELD;
    sqlParams["@HasChild"].SourceColumn=GoodsCategoryData.HASCHILD_FIELD;
    sqlParams["@Description"].SourceColumn=GoodsCategoryData.DESCRIPTION_FIELD;
    SqlDataAdapter dsCommand;
    dsCommand.InsertCommand=theInsertCommand;
    dsCommand.Update(data,"MyTable"); //注意这个MyTable
    if ( data.HasErrors )
    {
    data.Tables[GoodsCategoryData.TABLE_NAME].GetErrors()[0].ClearErrors();
    return false;
    }
    else
    {
    data.AcceptChanges();
    return true;
    }}
      

  3.   

    还是漏了点东西,void bool InsertData(DataSet ds)
    {
                   String sqlStr;
    sqlStr="insert into myTable(CategoryName,ParentID,HasChild,Description) values (@CategoryName,@ParentID,@HasChild,@Description);select @PkID=@@identity";
    theInsertCommand  = new SqlCommand(sqlStr,new SqlConnection(ConstructionConfiguration.ConnectionString));
    SqlParameterCollection sqlParams = theInsertCommand.Parameters;
    sqlParams.Add(new SqlParameter( "@PkID",SqlDbType.Int));
    sqlParams.Add(new SqlParameter( "@CategoryName",SqlDbType.Char,50));
    sqlParams.Add(new SqlParameter( "@ParentID",SqlDbType.Int));
    sqlParams.Add(new SqlParameter( "@HasChild",SqlDbType.Char));
    sqlParams.Add(new SqlParameter( "@Description",SqlDbType.Char));
    sqlParams["@PkID"].SourceColumn=GoodsCategoryData.PKID_FIELD;
    sqlParams["@PkID"].Direction=ParameterDirection.Output;
    sqlParams["@CategoryName"].SourceColumn=GoodsCategoryData.CATEGORYNAME_FIELD;
    sqlParams["@ParentID"].SourceColumn=GoodsCategoryData.PARENTID_FIELD;
    sqlParams["@HasChild"].SourceColumn=GoodsCategoryData.HASCHILD_FIELD;
    sqlParams["@Description"].SourceColumn=GoodsCategoryData.DESCRIPTION_FIELD;
    SqlDataAdapter dsCommand;
    dsCommand = new SqlDataAdapter();
    dsCommand.SelectCommand = new SqlCommand();
    dsCommand.SelectCommand.Connection  = new SqlConnection("数据库联接串");

    dsCommand.InsertCommand=theInsertCommand;
    dsCommand.Update(data,"MyTable"); //注意这个MyTable
    if ( data.HasErrors )
    {
    data.Tables[GoodsCategoryData.TABLE_NAME].GetErrors()[0].ClearErrors();
    return false;
    }
    else
    {
    data.AcceptChanges();
    return true;
    }}
      

  4.   

    有主键的数据表可以保证数据记录不重复!
    更新前不用先删除数据记录!因为DataAdapter.Update方法是根据Row.RowState来更新数据的。未修改记录的状态始终是DataRowState.Unchanged删除操作可用:dt.Clear();方法快速清空,然后调用dt.AcceptChanges()方法。
      

  5.   

    我是在将本地几十万的数据往总部几百万的数据库里加数据,但有时会重新传送昨天或者以前的数据,
    我不可能把总部以前的数据取出来,因为太多了,所以只能先取个空数据表DATASET,这边的我会按条件全部取出来,然后重新添加到总部的空DATASET去,然后再调用DATASET的UPDATE方法,添加到总部,之前要先删除总部原来的数据,不然就会出错。现在比较头疼的,就是删除这一步太慢。DATASET的UPDATE还行。
      

  6.   

    为什么要删除呢?有的update,没有的insert