zoukankan      html  css  js  c++  java
  • 从数据库中读数据中寻找若隐若现的OOP

    最近因为一直在看ext
    所以和json 打交道打的比较多,
    以前都是习惯性的
    把数据读到dataset
    之后调用ConvertToJson方法
    (博客园有这个,只不过与ext的json稍微有点bug,更正在下面)

    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Text;
    using System.Collections;
    using System.Globalization;
    using System.Reflection;

    /// <summary>
    /// ConvertToJson一个存储对象,收获Json
    /// </summary>


    //非著乃编。。。。 

     
    public class JsonConvert
    {
        
    private static void WriteDataRow(StringBuilder sb, DataRow row)
        
    {
            sb.Append(
    "{");
            
    foreach (DataColumn column in row.Table.Columns)
            
    {
                sb.AppendFormat(
    "\"{0}\":", column.ColumnName);
                WriteValue(sb, row[column]);
                sb.Append(
    ",");
            }

            
    // Remove the trailing comma.
            if (row.Table.Columns.Count > 0)
            
    {
                
    --sb.Length;
            }

            sb.Append(
    "}");
        }


        
    private static void WriteDataSet(StringBuilder sb, DataSet ds)
        
    {
            sb.Append(
    "{\"Tables\":{");
            
    foreach (DataTable table in ds.Tables)
            
    {
                sb.AppendFormat(
    "\"{0}\":", table.TableName);
                WriteDataTable(sb, table);
                sb.Append(
    ",");
            }

            
    // Remove the trailing comma.
            if (ds.Tables.Count > 0)
            
    {
                
    --sb.Length;
            }

            sb.Append(
    "}}");
        }


        
    private static void WriteDataTable(StringBuilder sb, DataTable table)
        
    {
            sb.Append(
    "{\"rows\":[");
            
    foreach (DataRow row in table.Rows)
            
    {
                WriteDataRow(sb, row);
                sb.Append(
    ",");
            }

            
    // Remove the trailing comma.
            if (table.Rows.Count > 0)
            
    {
                
    --sb.Length;
            }

            sb.Append(
    "]}");
        }


        
    private static void WriteEnumerable(StringBuilder sb, IEnumerable e)
        
    {
            
    bool hasItems = false;
            sb.Append(
    "[");
            
    foreach (object val in e)
            
    {
                WriteValue(sb, val);
                sb.Append(
    ",");
                hasItems 
    = true;
            }

            
    // Remove the trailing comma.
            if (hasItems)
            
    {
                
    --sb.Length;
            }

            sb.Append(
    "]");
        }


        
    private static void WriteHashtable(StringBuilder sb, Hashtable e)
        
    {
            
    bool hasItems = false;
            sb.Append(
    "{");
            
    foreach (string key in e.Keys)
            
    {
                sb.AppendFormat(
    "\"{0}\":", key.ToLower());
                WriteValue(sb, e[key]);
                sb.Append(
    ",");
                hasItems 
    = true;
            }

            
    // Remove the trailing comma.
            if (hasItems)
            
    {
                
    --sb.Length;
            }

            sb.Append(
    "}");
        }


        
    private static void WriteObject(StringBuilder sb, object o)
        
    {
            MemberInfo[] members 
    = o.GetType().GetMembers(BindingFlags.Instance | BindingFlags.Public);
            sb.Append(
    "{");
            
    bool hasMembers = false;
            
    foreach (MemberInfo member in members)
            
    {
                
    bool hasValue = false;
                
    object val = null;
                
    if ((member.MemberType & MemberTypes.Field) == MemberTypes.Field)
                
    {
                    FieldInfo field 
    = (FieldInfo)member;
                    val 
    = field.GetValue(o);
                    hasValue 
    = true;
                }

                
    else if ((member.MemberType & MemberTypes.Property) == MemberTypes.Property)
                
    {
                    PropertyInfo property 
    = (PropertyInfo)member;
                    
    if (property.CanRead && property.GetIndexParameters().Length == 0)
                    
    {
                        val 
    = property.GetValue(o, null);
                        hasValue 
    = true;
                    }

                }

                
    if (hasValue)
                
    {
                    sb.Append(
    "\"");
                    sb.Append(member.Name);
                    sb.Append(
    "\":");
                    WriteValue(sb, val);
                    sb.Append(
    ",");
                    hasMembers 
    = true;
                }

            }

            
    if (hasMembers)
            
    {
                
    --sb.Length;
            }

            sb.Append(
    "}");
        }


        
    private static void WriteString(StringBuilder sb, string s)
        
    {
            sb.Append(
    "\"");
            foreach (char c in s)
            
    {
                
    switch (c)
                
    {
                    
    case '\"':
                        sb.Append(
    "\\\"");
                        break;
                    
    case '\\':
                        sb.Append(
    "\\\\");
                        
    break;
                    
    case '\b':
                        sb.Append(
    "\\b");
                        
    break;
                    
    case '\f':
                        sb.Append(
    "\\f");
                        
    break;
                    
    case '\n':
                        sb.Append(
    "\\n");
                        
    break;
                    
    case '\r':
                        sb.Append(
    "\\r");
                        
    break;
                    
    case '\t':
                        sb.Append(
    "\\t");
                        
    break;
                    
    default:
                        
    int i = (int)c;
                        
    if (i < 32 || i > 127)
                        
    {
                            sb.AppendFormat(
    "\\u{0:X04}", i);
                        }

                        
    else
                        
    {
                            sb.Append(c);
                        }

                        
    break;
                }

            }

            sb.Append(
    "\"");
        }

        
    public static void WriteValue(StringBuilder sb, object val)
        
    {
            
    if (val == null || val == System.DBNull.Value)
            
    {
                sb.Append(
    "null");
            }

            
    else if (val is string || val is Guid)
            
    {
                WriteString(sb, val.ToString());
            }

            
    else if (val is bool)
            
    {
                sb.Append(val.ToString().ToLower());
            }

            
    else if (val is double ||
                val 
    is float ||
                val 
    is long ||
                val 
    is int ||
                val 
    is short ||
                val 
    is byte ||
                val 
    is decimal)
            
    {
                sb.AppendFormat(CultureInfo.InvariantCulture.NumberFormat, 
    "{0}", val);
            }

            
    else if (val.GetType().IsEnum)
            
    {
                sb.Append((
    int)val);
            }

            
    else if (val is DateTime)
            
    {
                sb.Append(
    "new Date(\"");
                sb.Append(((DateTime)val).ToString("MMMM, d yyyy HH:mm:ss"new CultureInfo("en-US"false).DateTimeFormat));
                sb.Append(
    "\")");
            }

            
    else if (val is DataSet)
            
    {
                WriteDataSet(sb, val 
    as DataSet);
            }

            
    else if (val is DataTable)
            
    {
                WriteDataTable(sb, val 
    as DataTable);
            }

            
    else if (val is DataRow)
            
    {
                WriteDataRow(sb, val 
    as DataRow);
            }

            
    else if (val is Hashtable)
            
    {
                WriteHashtable(sb, val 
    as Hashtable);
            }

            
    else if (val is IEnumerable)
            
    {
                WriteEnumerable(sb, val 
    as IEnumerable);
            }

            
    else
            
    {
                WriteObject(sb, val);
            }

        }

        
    public static string ConvertToJson(object o)
        
    {
            StringBuilder sb 
    = new StringBuilder();
            WriteValue(sb, o);
            
    return sb.ToString();
        }

    }



    随着项目的深入,
    我发现这么做好处很显然,速度快,但是坏处也有,东西一多,到处都是dataset。。。
    看了<你必须知道的.net >后,
    我就在想,是不是我们需要把这些封装到类里面来传呢?

    比如说表 
    ----------------------------------
    table customers
    ----------------------------------
    id                           int (PK)
    name                      nvarchar(10)
    sex                        bit
    phone                    nvarchar(15)
    Email                     nvarchar(30)
    .                           .
    .                           .
    .                           .
    ----------------------------------
    中,我先定义个类,基本情况如下


    —————————————————
    Student
    —————————————————
    +Id :int
    +Name:string
    +Sex:bool
    +Phone:string
    +Email:string
    —————————————————
    changeName(string):void
    .
    .
    .
    —————————————————
    之后实例化它,先将表中的信息填写到这个对象里面
    之后通过Json.Net 中的
    string json = JavaScriptConvert.SerializeObject(student);
    这样的话貌似每个都变成了对象方便处理,当然,也复杂不少。。。。

    初学者,以往的blog 都不敢公开,
    写到这个确实觉得确实有点意思,决定第一次放到新手区。。
    希望得到各位高手指教,本人先在这里谢谢大家了。

    code在下
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using Newtonsoft.Json;


    public partial class Default2 : System.Web.UI.Page
    {
        
        
    protected void Page_Load(object sender, EventArgs e)
        
    {
            
    //自己写的一个方法,实现的就是返回个dt,旧些时候的帖子上有这个的代码
            SqlCon sqlCon = new SqlCon("test1ConnectionString");
            DataTable dt 
    = sqlCon.tableFromSql("select * from customers");
            
    // 返回dt完毕

            
    //看看dt中有多少行
            int count = dt.Rows.Count;

            
    //申明一个对象数组
            Customer[] customer = new Customer[count];
            
            
    //初始化每个对象
            for (int i = 0; i < count; i++)
            
    {
                customer[i] 
    = new Customer();
                DataRow dr 
    = dt.Rows[i];
                customer[i].Id 
    = int.Parse(dr["id"].ToString());
                customer[i].Name 
    = dr["Name"].ToString();
            }



            
    string a = JavaScriptConvert.SerializeObject(customer);
            Response.Write(a);
            
    /*result  here 
         
             * [
             * {"Id":1,"Name":"赵一","Sex":"Female","Email":null},
             * {"Id":2,"Name":"钱二","Sex":"Female","Email":null},
             * {"Id":3,"Name":"孙三","Sex":"Female","Email":null},
             * {"Id":4,"Name":"李四","Sex":"Female","Email":null}
             * ] 
             
    */


        }

    }

    class Customer
    {
        
    private int _id;
        
    private string _name;
        
    private bool _sex;
        
    private string _email;
        
    public int Id
        
    {
            
    set {_id = value; }
            
    get return _id; }
        }

        
    public string Name
        
    {
            
    set { _name = value.ToUpper(); }
            
    get return _name; }
        }

        
    public string Sex
        
    {
            
    set 
            
    {
                
    if (value.ToUpper() == "True")
                
    {
                    _sex 
    = true;
                }

                
    else if (value.ToUpper() == "False")
                
    {
                    _sex 
    = false;
                }

                
    else
                
    {
                    
    throw new Exception("input male or female only");
                }

            }

            
    get
            
    {
                
    if (_sex == true)
                
    return "Male"; }
                
    else
                
    return "Female"; }
            }

        }

        
    public string Email
        
    {    
            
    set 
            
    {
                
    if(Email.Contains("@")==false)
                
    {
                    
    throw new Exception("input Wrong Email");
                }

                
    else
                
    {_email = value;}
            }

            
    get
            
    {
                
    return _email;
            }

           
        }

        
    public Customer()
        
    {
            
    //do Nothing
        }

        
    public Customer(int id,string name,string sex,string email)
        
    {
            
    this.Id = id;
            
    this.Name = name;
            
    this.Sex = sex;
            
    this.Email = email;
        }

        
    public void eating()
        
    {
            HttpContext.Current.Response.Write(
    "cry"); 
        }

    }



  • 相关阅读:
    hdu 5532 Almost Sorted Array(模拟)
    hdu 2612 Find a way(bfs)
    hdu 2660 Accepted Necklace(dfs)
    reactjs学习一(环境搭配react+es6+webpack热部署)
    途牛banner自动轮播
    web app开发技巧总结
    20个为前端开发者准备的文档和指南
    Github上最受关注的前端大牛 快来膜拜把!
    怎么才能成为优秀的前端开发工程师?
    Web前端知识技能大汇总
  • 原文地址:https://www.cnblogs.com/jicheng1014/p/1192423.html
Copyright © 2011-2022 走看看