Search code examples
c#classdispose

What to put into my Class's Dispose method


I am writing my own data access layer class for the first time so I would like to wrap it inside a (using) parenthesis but that requires the class to implement Idisposable.

The only thing I put in there is

conn.close()

is there something else missing that i should be adding there?

class overview:

public class DAL : IDisposable
{
    SqlConnection conn;
    SqlCommand cmd;
    SqlTransaction transaction;
    public int Status = 1;
    public DAL()
    {
        conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MyDB"].ConnectionString);
        conn.Open();
    }
    public void InsertRequest(UserAndRequestInfo UInfo, UserCrops UCrop)
    {            
    }
    public void InsertBGs(BreedingGroups BG)
    {
    }
    public void EndTransaction()
    {
        if (Status == 1)
            transaction.Commit();
        if (Status < 0)
            transaction.Rollback();
    }
    public void EndConnection()
    {
        conn.Close();
    }
    void Dispose()
    {
        conn.Close();
    }

called from:

        using (DAL db = new DAL())
        {
            foreach (var crop in UInfo.UserCropInfo)
            {
                db.InsertRequest(UInfo, crop);
                foreach (BreedingGroups bg in crop.BGs)
                {
                    db.InsertBGs(bg);
                }
                db.EndTransaction();
            }
            db.EndConnection(); <---- //If 'using' is there I'll remove this line
        }

Also, in this particular case, wouldn't be just better to call an db.EndConnection() method


Solution

  • Yes: Call Dispose() on any disposable variables in your class.

    void Dispose()
    {
        if(cmd != null)
            cmd.Dispose();
        if(transaction != null)
            transaction.Dispose();
        if(conn != null)
            conn.Dispose();
    }
    

    edit: conn.Dispose() will also call conn.Close() so you shouldn't need to also call close it if you call dispose.