/// <summary>
        /// 比较数据,得到新增的行,修改的行,删除的行,未变化的行
        /// 此算法必须先排序
        /// </summary>
        /// <param name="dtSource"></param>
        /// <param name="dtTarget"></param>
        /// <param name="insertRows"></param>
        /// <param name="updateRows"></param>
        /// <param name="deleteRows"></param>
        /// <param name="noChangeRows"></param>
        public static void CompareData(List <DataRow> dtSource,
                                       DataTable dtTarget,
                                       TableMap tabMap,
                                       out List <DataRow> insertRows,
                                       out List <DataRow> updateRows,
                                       out List <DataRow> deleteRows,
                                       out List <DataRow> noChangeRows)
        {
            insertRows   = new List <DataRow>();
            updateRows   = new List <DataRow>();
            deleteRows   = new List <DataRow>();
            noChangeRows = new List <DataRow>();

            // 源表没有记录,则认为全部是删除的
            if (dtSource.Count == 0)
            {
                for (int x = 0; x < dtTarget.Rows.Count; x++)
                {
                    DataRow row = dtTarget.Rows[x];
                    deleteRows.Add(row);
                }
                return;
            }

            // 如果目标没有记录,则认为全部是新增的
            if (dtTarget.Rows.Count == 0)
            {
                for (int x = 0; x < dtSource.Count; x++)
                {
                    DataRow row = dtSource[x];
                    insertRows.Add(row);
                }
                return;
            }


            int i = 0;    //i,j等于-1时表示对应的集合结束
            int j = 0;
            int ret;

            //无条件循环,当有一个集合结束(下标变为-1)跳出循环
            while (true)
            {
                if (i >= dtSource.Count)
                {
                    i = -1; // 源结束
                }

                if (j >= dtTarget.Rows.Count)
                {
                    j = -1;// 目标结束
                }

                //两个集合都没有结束时,执行比较,否则跳出循环(至少一个集合结束)
                if (i != -1 && j != -1)
                {
                    DataRow rowSource = dtSource[i];
                    DataRow rowTarget = dtTarget.Rows[j];

                    // 注意这里,1)定义主键;2)排序条件是按主键排序;3)数据表只有一个主键
                    string strKeySourceValue = rowSource[tabMap.SourceTable.PrimaryKeyList[0]].ToString().ToLower(); //08/03/27改
                    string strKeyTargetValue = rowTarget[tabMap.TargetTable.PrimaryKeyList[0]].ToString().ToLower(); //08/03/27改

                    // 比较主键,以便确定是新增,还是修改/不变,还是删除
                    ret = string.Compare(strKeySourceValue, strKeyTargetValue, StringComparison.Ordinal);//, true);// 不能忽略大小写 2008/3/18
                    if (strKeySourceValue == "b01d046c91504a4fa3ab9d34ae005483")
                    {
                        int ntemp = 0;
                        ntemp++;
                    }

                    // 当等于0时,主键相同,表示修改/不变的情况
                    if (ret == 0)
                    {
                        // 比较是否完全一致,从而确定是修改还是不变
                        if (tabMap.CompareRow(rowSource, rowTarget) == true)
                        {
                            noChangeRows.Add(rowSource);
                        }
                        else
                        {
                            updateRows.Add(rowSource);
                        }

                        i++;
                        j++;
                    }

                    // 小于0,表示源在目标中不存在,新增
                    if (ret < 0)
                    {
                        insertRows.Add(rowSource);
                        i++;
                    }

                    // 大于0,表示目标中多余的项,删除
                    if (ret > 0)
                    {
                        deleteRows.Add(rowTarget);
                        j++;
                    }
                }
                else
                {
                    break;
                }
            }

            // 处理剩余的末尾记录
            if (i != -1 && i < dtSource.Count)
            {
                for (; i < dtSource.Count; i++)
                {
                    insertRows.Add(dtSource[i]);
                }
            }

            if (j != -1 && j < dtTarget.Rows.Count)
            {
                for (; j < dtTarget.Rows.Count; j++)
                {
                    deleteRows.Add(dtTarget.Rows[j]);
                }
            }

            return;
        }