在我的应用程序中出现OutOfMemoryException,我尝试使用using和dispose()!

时间:2012-08-30 10:37:06

标签: c# sql-server out-of-memory

我刚刚阅读了有关同一问题的所有答案,但他们没有帮助。

这是我的c#代码的一部分太长了。它有很多SQLConnection和2个计时器。

Indirizzo nuovoInd = new Indirizzo();

SqlConnection cn = new SqlConnection(nuovoInd.OttieniIP());
string strSql = "INSERT INTO Pietanze(nome,prezzo,ingredienti,cod_cat) VALUES ('"+nome+"','"+prezzo+"','"+ingredienti+"','"+contCat+"')";
SqlCommand cmd = new SqlCommand(strSql, cn);

cn.Open();
SqlDataReader dr = cmd.ExecuteReader();

public static float GetCoperti(int codOrdine)
    {
        float copertiTot = 0;
        List<Ordine> ordini = new List<Ordine>();

        VisualizzaOrdini.Form1.Indirizzo nuovoInd = new VisualizzaOrdini.Form1.Indirizzo();

        SqlConnection cn = new SqlConnection(nuovoInd.OttieniIP());
        string strSql = "SELECT codo,tavolo,InsertDate,nCoperti,costoCoperti FROM Ordini, Riga_Ordine, Coperti where codo=cod_or and cod_or = '"+ codOrdine + "' ORDER BY InsertDate DESC";
        SqlCommand cmd = new SqlCommand(strSql, cn);

        cn.Open();
        SqlDataReader dr = cmd.ExecuteReader();
        while (dr.Read())
        {
            Ordine currO = new Ordine();
            currO.Data = Convert.ToDateTime(dr["InsertDate"]);
            currO.Coperti = (int)dr["nCoperti"];
            currO.PrezzoCoperto = Convert.ToSingle(dr["costoCoperti"]);
            currO.Tavolo = dr["tavolo"].ToString();
            currO.Codice = (int)dr["codo"];
            copertiTot = (currO.PrezzoCoperto * Convert.ToSingle(currO.Coperti));
            ordini.Add(currO);
        }

        return copertiTot;

    }

我正在努力解决代码抛出OutOfMemoryException的问题。可能是什么导致了这个?我该如何解决?

2 个答案:

答案 0 :(得分:0)

在获取记录后,您可能不是Closing您的SqlDataReader对象,您必须明确关闭它。

dr.Close();

此外,关闭阅读器后关闭您的连接,或按照 Habib 的建议使用using阻止。

cn.Close();

答案 1 :(得分:0)

首先,打开数据库连接以完全执行代码是不好的做法。将execute语句分配给某些DataTable。它将为您提供数据库的本地副本。处理起来也更方便,你肯定不会出现内存异常。

Datatable DTab = cmdexecuteReader(); DataSet DSet = cmdexecuteReader();

两者都会给你预期的结果。