prettify

baseline

C# Collection Class Template

Use this class as a template for Collection classes.
This is the class Persons to accompany the class Person.
Persons.cs:
public class Persons: IEnumerable {
    private List Items = new List();

    public string sError = "";
    public Person Add(Person oItem) {
        Items.Add(oItem);
        return oItem;
    }
    public Persons Clear() {
        Items.Clear();
        sError = "";
        return this;
    }
    public int Count() {
        return Items.Count;
    }
    IEnumerator IEnumerable.GetEnumerator() {
        return null;
    }
    IEnumerator IEnumerable.GetEnumerator() {
        foreach (Person oItem in Items) {
            yield return oItem;
        }
    }
    public Page oPage = new Page();

    #region SQL
    private static string sTable = "Persons";
    private static string SQL0 = "SELECT CAST(COUNT(*) AS INT) nc FROM " + sTable;
    private static string sFr1 = ",Partys.*"
            + ",sfPerOrg=COALESCE((SELECT TOP 1 sOrgNm FROM Organizations WHERE nfOrgPar=nfPerOrg),'')"
            + ",sfPerUnt=COALESCE((SELECT TOP 1 sUntNm FROM Units WHERE nfUntPar=nfPerUnt),'')"
            + ",sfParPerOwn=dbo.GetObjNm('Person',nfParPerOwn)"
            + ",sComLND=COALESCE((SELECT TOP 1 sCom FROM Communicators WHERE nfComPar=nfPerPar AND eComUse='CON' AND eComType='LND' ORDER BY nkCom),'')"
            + ",sComMOB=COALESCE((SELECT TOP 1 sCom FROM Communicators WHERE nfComPar=nfPerPar AND eComUse='CON' AND eComType='MOB' ORDER BY nkCom),'')"
            + ",sComEML=COALESCE((SELECT TOP 1 sCom FROM Communicators WHERE nfComPar=nfPerPar AND eComUse='CON' AND eComType='EML' ORDER BY nkCom),'')"
            + ",sLoc=COALESCE((SELECT TOP 1 sLocAdr+NCHAR(9)+sLocZip+NCHAR(9)+sLocCty FROM Locators WHERE nfLocPar=nfPerPar AND eLocUse='CON' ORDER BY nkLoc),'')";
    private static string sJoin = " INNER JOIN Partys ON nfPerPar=nkPar";
    public int LoadPage() {
        SqlConnection cn = DB.GetCn();
        SqlCommand cmd = cn.CreateCommand();
        string sOrder = ParseOrder();
        string sWhere = ParseWhere(cmd);
        string SQL = SQL0 + (sWhere == "" ? "" : " WHERE " + sWhere) + ";";
        if (oPage.bPage) {
            if (oPage.nPage == 0) {
                SQL += "SELECT TOP " + oPage.nPageSize.ToString() + " " + sTable + ".*" +
                    sFr1 +
                    " FROM " + sTable + " " +
                    sJoin +
                    (sWhere == "" ? "" : " WHERE " + sWhere + " ") +
                    (sOrder == "" ? "" : " ORDER BY " + sOrder + " ");
            } else {
                SQL += "WITH t AS (SELECT ROW_NUMBER() OVER (ORDER BY " + sOrder + ") rn," +
                    sTable + ".* FROM " + sTable + " " + sJoin + " " +
                    (sWhere == "" ? "" : " WHERE " + sWhere + " ") +
                    ") " +
                "SELECT t.*" +
                sFr1 +
                " FROM t " +
                sJoin +
                " WHERE rn BETWEEN " + (oPage.nPageSize * oPage.nPage + 1).ToString() + " AND " + (oPage.nPageSize * (oPage.nPage + 1)).ToString() + " " +
                (sWhere == "" ? "" : " AND " + sWhere + " ") +
                (sOrder == "" ? "" : " ORDER BY " + sOrder + " ");
            }
        } else {
            SQL += "SELECT " + sTable + ".*" +
                sFr1 +
                " FROM " + sTable + " " +
                sJoin +
                (sWhere == "" ? "" : " WHERE " + sWhere + " ") +
                (sOrder == "" ? "" : " ORDER BY " + sOrder + " ");
        }
        cmd.CommandText = SQL;
        LoadCmd(cmd);
        cmd.Dispose();
        cn.Dispose();
        return Count();
    }
    private string ParseOrder() {
        string sOrder = "";
        int nPos;
        string[] aOrder = oPage.sOrder.Split('\r');
        for (nPos = 0; nPos <= aOrder.Length - 1; nPos++) {
            if (nPos > 0) sOrder += ",";
            switch (aOrder[nPos]) {
            case "sPerNm ASC":
                sOrder += "sPerLNm,sPerFNm,nfPerPar";
                break;
            case "sPerNm DESC":
                sOrder += "sPerLNm DESC,sPerFNm DESC,nfPerPar DESC";
                break;
            case "nfPerUnt ASC":
                sOrder += "dbo.GetTreeUnt(nfPerUnt)";
                break;
            case "nfPerUnt DESC":
                sOrder += "dbo.GetTreeUnt(nfPerUnt) DESC";
                break;
            case "nfPerOrg ASC":
            case "nfPerOrg DESC":
            case "sPerTel ASC":
            case "sPerTel DESC":
            case "sPerEml ASC":
            case "sPerEml DESC":
                sOrder += aOrder[nPos];
                break;
            default:
                sOrder = "";
                break;
            }
        }
        return sOrder;
    }
    private string ParseWhere(SqlCommand cmd) {
        StringBuilder sb = new StringBuilder();
        int nFld, nPos;
        try {
            if (oPage.sWhere != string.Empty) {
                string[] aFlds = oPage.sWhere.Split('\n');
                Dictionary aDic = new Dictionary();
                for (nFld = 0; nFld < aFlds.Length; nFld++) {
                    nPos = aFlds[nFld].IndexOf(':');
                    aDic.Add(aFlds[nFld].Substring(0, nPos), aFlds[nFld].Substring(nPos + 1));
                }
                if (aDic["sPerNm"] != "") {
                    sb.Append("sPerLNm LIKE @sNm+'%'");
                    cmd.Parameters.Add("@sNm", SqlDbType.NVarChar, 100).Value = aDic["sPerNm"];
                }
            }
            switch (oPage.sWhat) {
            case "nfPerUnt":
            case "nfPerOrg":
                int nf = 0;
                int.TryParse(oPage.sData, out nf);
                //if (nf > 0) {
                    if (sb.Length > 0) sb.Append(" AND ");
                    sb.Append(oPage.sWhat + "=@nf ");
                    cmd.Parameters.Add("@nf", SqlDbType.Int).Value = nf;
                //}
                break;
            }
        } catch (Exception ex) {
            System.Diagnostics.Debug.Fail(ex.Message);
        }
        return sb.ToString();
    }
    private void LoadCmd(SqlCommand cmd) {
        SqlDataReader dr = cmd.ExecuteReader();
        dr.Read();
        oPage.nTotal = (int)dr["nc"];
        dr.NextResult();
        Person oItem;
        Clear();
        while (dr.Read()) {
            oItem = new Person();
            oItem.ParseDr(dr);
            Add(oItem);
        }
        dr.Dispose();
    }
    #endregion
    #region Client-server
    private enum enFldJs {
        bPage = 0,
        nPage,
        nPageSize,
        sOrderBy,
        LENGTH
    };
    public void ParseFromJs(string sVals) {
        string[] aVals = sVals.Split('\r');
        oPage.ParseFromJs(aVals[0]);
        Items.Clear();
        Person oItem;
        for (int nPer = 0; nPer <= aVals.Length - 2; nPer++) {
            oItem = new Person();
            oItem.ParseFromJs(aVals[nPer + 1]);
            Items.Add(oItem);
        }
    }
    public string ToJson() {
        StringBuilder sb = new StringBuilder("[");
        sb.Append(oPage.ToJson());
        sb.Append(",[");
        bool bFirst = true;
        foreach (Person oItem in Items) {
            if (bFirst) bFirst = false; else sb.Append(",");
            sb.Append(oItem.ToJson());
        }
        sb.Append("]]");
        return sb.ToString();
    }
    #endregion Client-server
}

No comments:

Post a Comment