Visar inlägg med etikett sql. Visa alla inlägg
Visar inlägg med etikett sql. Visa alla inlägg

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");
            }

onsdag 1 april 2009

DEVTIPS #10 T-SQL Soundex() Function

Soundex är ett fonetiskt mönstermatchingssystem.
T ex lagras namnet "Nielsen" med N425 här nedan följer en förklaring.

Första bokstaven lagras och dom följande 3 fonetiska ljuden blir sparade enligt följande regler:
1 - B, F, P, V
2 - C, G, J, K, Q, S, X, Z
3 - D, T
4 - L
5 - M, N
6 - R

A,E,I,O,U,H,W,Y kastas bort.

"Nielsen" lagras som N425:
1. N Lagras
2. i och e kastas bort.
3. l ljudet sparas som 4.
4. s lagras som 2.
5. e kastas bort.
6. n lagras som 5. 

Soundex lagrar "Nielsen", "Nelson" och "Neilson" med samma kod: N425

SQL Exempel:
   SELECT LastName, FirstName
  FROM Customer
  WHERE SOUNDEX('Nielsen') = SOUNDEX(LastName)

Resultat:
  LastName FirstName
  ----------------------------------
  Nielsen  John
  Nelson  Robert
  Neilson  Anna