使用存储过程时出现“Out of Memory”错误

时间:2013-05-06 13:54:12

标签: c# odbc sybase-asa

我写了一些服务来创建dbs,在dbs或表之间复制一些记录等,这么多db操作。但即时通讯处理内存问题。其中之一:

我通过商店程序获取记录并填写实体列表;

    public List<FpBatteryEntity> LoadFPBattery()
    {
        List<FpBatteryEntity> retVal = new List<FpBatteryEntity>();

        DataSet dataSet = _dataAccessProvider.ExecuteSPDataSet("sp_fp_battery", null);
        if (dataSet != null && dataSet.HasData())
        {
            DataTable requestsTable = dataSet.Tables[0];
            if (requestsTable != null && requestsTable.HasData())
            {
                foreach (DataRow row in requestsTable.Rows)
                {
                    FpBatteryEntity entity = new FpBatteryEntity()
                    {
                        Faceplate = row["tf_faceplate"],
                        Battery = row["tf_battery"]
                    };
                    retVal.Add(entity);
                }
            }
        }
        return retVal;
    }

然后对于列表中的每个实体,执行新的sp;

    public bool LoadFPBattery(List<FpBatteryEntity> entityList)
    {
        foreach (var entity in entityList)
        {
            DBParameterCollection parameters = new DBParameterCollection
            {
                new DBParameter("@faceplate", SqlDbType.VarChar, entity.Faceplate),
                new DBParameter("@battery", SqlDbType.VarChar, entity.Battery)
            };

            _dataAccessProvider.ExecuteSPNonQuery("sp_ins_fp_battery", parameters);
        }

        return true;
    }

不幸的是,我有30多个这样的操作,其中一些正在处理数千条记录。

调用这样的步骤;

        .....

        List<MapColorEntity> mapColor = _dbRepository.LoadMapColor(marketId);
        if (!_otherDbRepository.LoadMapColor(mapColor))
            return false;

        List<AttributesEntity> attributes = _dbRepository.LoadOptionAttrib(marketId);
        if (!_otherDbRepository.LoadOptionAttrib(OptionAttributes))
            return false;

        List<FpBatteryEntity> fpBattery = _dbRepository.LoadFPBattery();
        if (!_otherDbRepository.DelFPBattery())
            return false;
        if (!_otherDbRepository.LoadFPBattery(fpBattery))
            return false;

        .....

在5-6步操作后,“内存不足”错误导致损坏。我必须一步一步地完成所有这些操作。只是想知道,如果你有一个建议,使这些操作更富有成效和顺利。我该如何解决这个记忆问题?后面会发生什么?

用法;

Windows 7操作系统,3Gb可用Ram,Sybase ASE,Odbc驱动程序

1 个答案:

答案 0 :(得分:1)

我建议使用DataReader而不是DataTable。看起来你正在这样做,你的数据会有两份内存。