读到DataSet里面 再进行比较
如果仅需要读取ID的话 占用的内存还是比较小的。
发一段我原来写的代码 性能还不错     /// <summary>
        /// 比较两个DataSet,并产生增量数据
        /// </summary>
        /// <param name="oldDataSet">原始DataSet</param>
        /// <param name="nowDataSet">现有DataSet</param>
        /// <param name="primaryKey">原始DataSet和现有DataSet Tables[0]的主键</param>
        /// <returns>DataSet</returns>
        public DataSet CompareDataSet(DataSet oldDataSet, DataSet nowDataSet, string primaryKey)
        {
            //更新nowDataSet中的所有行,使之状态为DataRowState.UnChanged
            nowDataSet.AcceptChanges();
            //要返回的DataSet
            DataSet newDataSet = new DataSet();            //设置oldDataSet 和 newDataSet Tables[0] 的主键
            DataColumn dcOld = oldDataSet.Tables[0].Columns[primaryKey];
            DataColumn dcNow = nowDataSet.Tables[0].Columns[primaryKey];
            //设置主键
            oldDataSet.Tables[0].PrimaryKey = new DataColumn[1] { dcOld };
            nowDataSet.Tables[0].PrimaryKey = new DataColumn[1] { dcNow };            string primaryValue = string.Empty;
            string where = string.Empty;            foreach (DataRow drNow in nowDataSet.Tables[0].Rows)
            {
                //每行数据中,主键列所对应的值
                primaryValue = drNow[primaryKey].ToString();
                where = primaryKey + " = '" + primaryValue + "'";                //在oldDataSet 中查找和主键相同的行
                DataRow[] drOld = oldDataSet.Tables[0].Select(where);
                if (drOld.Length == 0)
                {
                    drNow.SetModified();
                }//说明nowDataSet中的这行数据是新增加的数据
                else
                {
                    for (int i = 0; i < drNow.ItemArray.Length; i++)
                    {
                        if (drNow.ItemArray.GetValue(i).ToString().Equals(drOld[0].ItemArray.GetValue(i).ToString()) == false)
                        {
                            drNow.SetModified();
                            break;
                        }//说明nowDataSet中的这行数据是修改过的数据
                    }
                }//判断两行中的每一列是否相等
            }            //装载DataRowState为 Modified的行
            DataTable dt = nowDataSet.Tables[0].GetChanges(DataRowState.Modified);
            if (dt != null)
            {
                newDataSet.Tables.Add(nowDataSet.Tables[0].GetChanges(DataRowState.Modified));
            }            return newDataSet;
        }

解决方案 »

  1.   

    谢谢三楼的答复,你用的将其放到DataSet里面的方法是一种办法,但是我觉得数据量很大的话性能上肯定有问题。
    因为数据量可能是达到千万条的级别。
      

  2.   

    作为一个理论研究,你至少先要把各种数据库的DDL、MDL列出来。不像有些人以为的数据库只有十几条语法,数据库往往需要支持上百条语法。另外,即使一个简单的Select也有复杂的结构,你必须将这些结构细节变为“强类型”的细节结构。如果你的系统知识接受一个“字符串”作为输入,那么你的系统根本无法处理异类数据库,只是停留在空想阶段。我在 http://topic.csdn.net/u/20080418/11/bd581f7c-b63e-4e33-8cf6-d088f4963471.html 中简单描述过关于数据操作语句接口不能用肤浅的“字符串”来设计。
      

  3.   

    答复六楼:目前的实际情况是:(1)我不知道其他数据库的具体的情况,因为是在一个较大的内部网络内,有各种不同的业务数据库,而各种数据库有其他的DBA。
                (2)我要做的是提供针对不同数据库的某些表中的数据的查询功能。
                (3)这种查询功能我只需要提供实现,让其他开发人员调用,至于大数据量的性能问题我只能尽量的从程序方面考虑,因为具体的数据库我也不能进行操作。