måndag 6 april 2009

DEVTIPS #14 Köra Stored Procedures enklare

För att få lite enklare hantering av ett datalager med en massa "Stored Procedures" kan man skapa en basklass som stänger connection i dispose.

   public class DbBase : IDisposable {
        protected SqlCommand mCommand = null;
        protected SqlConnection mConnection = null;
        protected SqlDataReader mReader = null;

        protected DbBase() {
            try {
                mConnection = new SqlConnection("connectionString goes here");
                mConnection.Open();
                mCommand = new SqlCommand();
                mCommand.Connection = mConnection;
                mCommand.CommandType = CommandType.StoredProcedure;
            } catch (Exception ex) {
                Dispose();
                throw ex;
            }
        }

        ~DbBase() {
            Dispose();
        }

        public void Dispose() {
            if (mConnection != null)
                mConnection.Close();
            if (mReader != null)
                mReader.Close();
        }
    }

Sedan skapar vi en klass som ärver av denna klass DbBase. Fördelen här är att vi inte behöver öppna och stänga connection hela tiden, det sköter basklassen DbBase om. Smidigt!

    public class DbDirectory : DbBase {
        public void pSerializedAdd(Guid EntryGUID, byte[] Data, string Name) {
            mCommand.CommandText = "Directory.pSerializedAdd";
            mCommand.Parameters.Clear();
            mCommand.Parameters.Add("@EntryGUID", SqlDbType.UniqueIdentifier).Value = EntryGUID;
            mCommand.Parameters.Add("@Data", SqlDbType.VarBinary).Value = Data;
            mCommand.Parameters.Add("@Name", SqlDbType.VarChar, 50).Value = Name;
            mCommand.ExecuteNonQuery();
        }

        public void pSerializedDelete(Guid EntryGUID, string Name) {
            mCommand.CommandText = "Directory.pSerializedDelete";
            mCommand.Parameters.Clear();
            mCommand.Parameters.Add("@EntryGUID", SqlDbType.UniqueIdentifier).Value = EntryGUID;
            mCommand.Parameters.Add("@Name", SqlDbType.VarChar, 50).Value = Name;
            mCommand.ExecuteNonQuery();
        }
    }

För att köra DbDirectory funktioner kör vi sedan med using som säkerställer att dispose i basklassen DbBase körs.
            using (DbDirectory dbDir = new DbDirectory()) {
                dbDir.pSerializedAdd(Guid.Empty, new byte[0], "test");
            }

Inga kommentarer: