危机来临!社会化媒体全部沦陷,营销正在失效

mikel阅读(1138)

原文《危机来临!社会化媒体全部沦陷,营销正在失效》,原文摘要:

在05、06年的时候,在论坛里写一篇软文做一次植入营销是一件很容易的事情。因为,那时候,论坛里氛围还是比较单纯的,很多企业远还未意识到论坛里的口 碑营销的价值。而到了07、08年之后,越来越多的水军侵入到论坛,网站管理员和版主艰苦的跟“水军”做着斗争,不过在企业做社会化营销的强烈需求的推动 下,大量的马甲在论坛里成批的出现,一些自动发帖软件被开发出来。于是,论坛里垃圾的广告贴越来越多,论坛生态被破坏,人们开始逃离,论坛开始走向衰落。

在2009年8月,新浪成为国内第一家开放微博服务的门户网站,由此开启了微博为主导的社会化营销的时代。就在很多用户发愁一个月长不了10个粉丝的时候,在淘宝上花10块钱就能直接涨1万个僵尸粉。而在新浪微博的大力推功和支持下,更多的企业账号涌入微博, 并将其作为社会化营销的主流阵地,大量的早安晚安心灵鸡汤和企业的产品消息,通过专门的微博运营人员每天持续的被制造,并定时推送给他们的粉丝们。微博开 始被企业、媒体、政府、营销等账号彻底占领,微博生态被破坏,人们开始陆续逃离。

而在今天,正如日中天的微信似乎似乎也正走在老路上。在很多人关注到微商的泛滥对微信朋友圈生态的破坏时,事实上目前对微信朋友圈这个社会化媒体平台的生态破坏最为严重的却是越来越多的企业将微信作为营销的阵地,并将精力逐步从微博转移到了微信上。

在今天,论坛已经渐渐无人问津,微博的衰落已是事实,而微信的疲态已经开始显现,但是新的平台级的社会化媒体平台还没有开始出现,目前的社会化营销时代看起来正在遭遇断层。

1、没有人再大红大紫

而在微信上,除了很多没有性格的自媒体文摘号或垂直圈子里的知名自媒体人外,并没有真正的红遍全网的红人出现。

2、没有品牌赖以成名

而在微信时代,尽管不少企业通过微信公众号的运营和推广,吸引了众多的品牌粉丝,但目力所及,还没有看到有一个品牌能够像小米或杜蕾斯那样在微博风行的时代受益如此之多。

3、没有产品因此畅销

不可否认的是,在微信这个社会化营销平台上,成功的面膜微商案例大多只是包裹着传销性质的销售神话。而一些做其他如农产品、土特产、手工艺品等产品的微商,面临的困境却是在消费完有效的微信好友资源之后,无法进一步扩大自己到社交范围从而打开更大的市场。

显而易见的是,当越来越多的企业投入到社会化营销的大潮中,社会化营销的各项手段就已经开始慢慢失效。一个个的热点被制造出来,又迅速消失。当热点越来越 多,目不暇接,然后人们就开始对于营销热点越来越麻木,也越来难以被打动直至兴奋尖叫。而如果你一直在关注社会化营销的发展的话,你会发现,已经很久没有 听到或看到一个真正成功的营销案例了。

当营销成为生活的常态,当我们的世界随时随地被营销事件所包围,到处都是包装过的故事或报道,你越来越看不清楚这个世界本真的模样,就意味着人们越来越难以被营销故事所打动。

于是,我们看到,雾霾来了,企业的公关和文案忙碌起来,开始借势刷屏;沙尘暴来了。企业的公关和文案又忙碌起来,开始借势刷屏;坠机事件发生,各类新闻平 台和app准备文案,忙着借势;春节、元宵节、情人节、五一劳动节、端午节、中秋节、母亲节、儿童节等等中外大小节日,无论是传统佳节还是舶来的洋节,统 统都是营销的节点,刷屏!刷屏!刷屏!没有创意和新意,不管品牌与节日搭还是不搭,全部一哄而上。这些传统的把戏,甚至连普通的用户都熟知一二。而被营销 刷屏惯了的用户,早已审美疲劳,只是默默的掠过。

观点:

社会化媒体的营销越来越让用户免疫了,很多营销手段也让久病成医的用户更加熟知得同时,也让用户们越来越怀疑网络的真实性,所以如此恶性循环让社会化媒体嫣然成了一个独角戏的场所,用户龟缩在自己熟知的小圈子里,发现有潜伏的无间道商家账号直接就给屏蔽和拉黑处理,可见用户已经见广告色变的地步。

可各种以小礼物赠送为诱饵的营销更加让用户变得精灵老练,那些曲线救国般的游戏规则用户都要认真的读读,反倒是那些简单直接的发红包类的方式更容易让人接受,所以说用户不再是那么好忽悠的和愚弄的,为什么说社会化媒体出不了过去的红人就是这个原因,只要传播出来的火爆的言论冷却时间也是惊人的短暂几分钟就完事儿了。

别再为了营销而营销,披着任何伪装外衣的营销都会在最后那一刻被用户所拆穿,然后被无情的抛弃。

 

[转载]反射操作工具类 - 扯 - 博客园

mikel阅读(1172)

[转载]反射操作工具类 – 扯 – 博客园.

 

复制代码

using System;
using System.Collections.Generic;
using System.Data;
using System.Reflection;

namespace Framework.Utility
{
    /// <summary>
    /// 反射操作工具类
    /// </summary>
    public class ReflectionUtil
    {
        #region 根据反射机制将dataTable中指定行的数据赋给obj对象

        /// <summary>
        /// 根据反射机制将dataTable中指定行的数据赋给obj对象
        /// </summary>
        /// <param name="obj">obj对象</param>
        /// <param name="dataTable">dataTable</param>
        /// <param name="rowIndex">指定行</param>
        public static void ConvertDataRowToModel(object obj, DataTable dataTable, int rowIndex)
        {
            //指定行不存在
            if (dataTable.Rows.Count < (rowIndex + 1))
            {
                throw new Exception("指定行不存在!");
            }

            //DataTable列为空!
            if (dataTable.Columns.Count < 1)
            {
                throw new Exception("DataTable列为空!");
            }

            Type type = obj.GetType();
            PropertyInfo[] pInfos = type.GetProperties();

            try
            {
                for (int i = 0; i < dataTable.Columns.Count; i++)
                {
                    for (int j = 0; j < pInfos.Length; j++)
                    {
                        //全部转换为小写的作用是防止数据库列名的大小写和属性的大小写不一致
                        if (dataTable.Columns[i].ColumnName.ToLower() == pInfos[j].Name.ToLower())
                        {
                            PropertyInfo pInfo = type.GetProperty(pInfos[j].Name);  //obj某一属性对象

                            object colValue = dataTable.Rows[rowIndex][i]; //DataTable 列值

                            #region 将列值赋给object属性

                            if (!ObjectIsNull(colValue))
                            {
                                if (pInfos[j].PropertyType.FullName == "System.String")
                                {
                                    pInfo.SetValue(obj, Convert.ToString(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Int32")
                                {
                                    pInfo.SetValue(obj, Convert.ToInt32(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Int64")
                                {
                                    pInfo.SetValue(obj, Convert.ToInt64(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Single")
                                {
                                    pInfo.SetValue(obj, Convert.ToSingle(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Double")
                                {
                                    pInfo.SetValue(obj, Convert.ToDouble(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Decimal")
                                {
                                    pInfo.SetValue(obj, Convert.ToDecimal(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Char")
                                {
                                    pInfo.SetValue(obj, Convert.ToChar(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Boolean")
                                {
                                    pInfo.SetValue(obj, Convert.ToBoolean(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.DateTime")
                                {
                                    pInfo.SetValue(obj, Convert.ToDateTime(colValue), null);
                                }
                                //可空类型
                                else if (pInfos[j].PropertyType.FullName == "System.Nullable`1[[System.DateTime, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]")
                                {
                                    pInfo.SetValue(obj, Convert.ToDateTime(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Nullable`1[[System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]")
                                {
                                    pInfo.SetValue(obj, Convert.ToDateTime(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Nullable`1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]")
                                {
                                    pInfo.SetValue(obj, Convert.ToInt32(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]")
                                {
                                    pInfo.SetValue(obj, Convert.ToInt32(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Nullable`1[[System.Int64, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]")
                                {
                                    pInfo.SetValue(obj, Convert.ToInt64(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Nullable`1[[System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]")
                                {
                                    pInfo.SetValue(obj, Convert.ToInt64(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Nullable`1[[System.Decimal, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]")
                                {
                                    pInfo.SetValue(obj, Convert.ToDecimal(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Nullable`1[[System.Decimal, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]")
                                {
                                    pInfo.SetValue(obj, Convert.ToDecimal(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Nullable`1[[System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]")
                                {
                                    pInfo.SetValue(obj, Convert.ToBoolean(colValue), null);
                                }
                                else if (pInfos[j].PropertyType.FullName == "System.Nullable`1[[System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]")
                                {
                                    pInfo.SetValue(obj, Convert.ToBoolean(colValue), null);
                                }
                                else
                                {
                                    throw new Exception("属性包含不支持的数据类型!");
                                }
                            }
                            else
                            {
                                pInfo.SetValue(obj, null, null);
                            }

                            #endregion 将列值赋给object属性

                            break;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                //LogTxt.LogException(ex.Message + "\r\n" + ex.Source + "\r\n" + ex.TargetSite + "\r\n" + ex.StackTrace + "\r\n");
                throw ex;
            }
        }

        #endregion 根据反射机制将dataTable中指定行的数据赋给obj对象

        #region 根据反射机制从obj对象取值并用该值添加datatable行

        /// <summary>
        /// 根据反射机制从obj对象取值并用该值添加datatable行
        /// </summary>
        /// <param name="obj">obj对象</param>
        /// <param name="dataTable">dataTable</param>
        /// <param name="rowIndex">指定行</param>
        public static void ConvertModelToNewDataRow(object obj, DataTable dataTable, int rowIndex)
        {
            //DataTable列为空!
            if (dataTable.Columns.Count < 1)
            {
                throw new Exception("DataTable列为空!");
            }

            DataRow dr = dataTable.NewRow();
            Type type = obj.GetType();
            PropertyInfo[] pInfos = type.GetProperties();

            try
            {
                for (int i = 0; i < dataTable.Columns.Count; i++)
                {
                    for (int j = 0; j < pInfos.Length; j++)
                    {
                        //全部转换为小写的作用是防止数据库列名的大小写和属性的大小写不一致
                        if (dataTable.Columns[i].ColumnName.ToLower() == pInfos[j].Name.ToLower())
                        {
                            PropertyInfo pInfo = type.GetProperty(pInfos[j].Name);

                            object beanValue = pInfo.GetValue(obj, null);

                            //将bean中属性值赋给datarow
                            if (!ObjectIsNull(beanValue))
                            {
                                dr[i] = beanValue;
                            }
                            else
                            {
                                dr[i] = DBNull.Value;
                            }
                            break;
                        }
                    }
                }

                dataTable.Rows.InsertAt(dr, rowIndex);
                dataTable.AcceptChanges();
            }
            catch (Exception ex)
            {
                //LogTxt.LogException(ex.Message + "\r\n" + ex.Source + "\r\n" + ex.TargetSite + "\r\n" + ex.StackTrace + "\r\n");
                throw ex;
            }
        }

        #endregion 根据反射机制从obj对象取值并用该值添加datatable行

        #region 根据反射机制从obj对象取值并赋给datatable的指定行

        /// <summary>
        /// 根据反射机制从obj对象取值并赋给datatable的指定行
        /// </summary>
        /// <param name="obj">obj对象</param>
        /// <param name="dataTable">dataTable</param>
        /// <param name="rowIndex">指定行</param>
        public static void ConvertModelToSpecDataRow(object obj, DataTable dataTable, int rowIndex)
        {
            //指定行不存在
            if (dataTable.Rows.Count < (rowIndex + 1))
            {
                throw new Exception("指定行不存在!");
            }

            //DataTable列为空!
            if (dataTable.Columns.Count < 1)
            {
                throw new Exception("DataTable列为空!");
            }

            Type type = obj.GetType();
            PropertyInfo[] pInfos = type.GetProperties();

            try
            {
                for (int i = 0; i < dataTable.Columns.Count; i++)
                {
                    for (int j = 0; j < pInfos.Length; j++)
                    {
                        //全部转换为小写的作用是防止数据库列名的大小写和属性的大小写不一致

                        if (dataTable.Columns[i].ColumnName.ToLower() == pInfos[j].Name.ToLower())
                        {
                            PropertyInfo pInfo = type.GetProperty(pInfos[j].Name);
                            object beanValue = pInfo.GetValue(obj, null);

                            //将bean中属性值赋给datarow
                            if (!ObjectIsNull(beanValue))
                            {
                                dataTable.Rows[rowIndex][i] = beanValue;
                            }
                            else
                            {
                                dataTable.Rows[rowIndex][i] = DBNull.Value;
                            }
                            break;
                        }
                    }
                }
                dataTable.AcceptChanges();
            }
            catch (Exception ex)
            {
                //LogTxt.LogException(ex.Message + "\r\n" + ex.Source + "\r\n" + ex.TargetSite + "\r\n" + ex.StackTrace + "\r\n");
                throw ex;
            }
        }

        #endregion 根据反射机制从obj对象取值并赋给datatable的指定行

        #region 根据对象名返回类实例

        /// <summary>
        /// 根据对象名返回类实例
        /// </summary>
        /// <param name="parObjectName">对象名称</param>
        /// <returns>对象实例(可强制转换为对象实例)</returns>
        public static object GetObjectByObjectName(string parObjectName)
        {
            Type t = Type.GetType(parObjectName); //找到对象
            return System.Activator.CreateInstance(t);         //实例化对象
        }

        #endregion 根据对象名返回类实例

        #region 判断对象是否为空

        /// <summary>
        /// 判断对象是否为空
        /// </summary>
        /// <param name="obj">对象</param>
        /// <returns></returns>
        static public bool ObjectIsNull(Object obj)
        {
            //如果对象引用为null 或者 对象值为null 或者对象值为空
            if (obj == null || obj == DBNull.Value || obj.ToString().Equals("") || obj.ToString() == "")
            {
                return true;
            }
            return false;
        }

        #endregion 判断对象是否为空

        #region 根据反射机制将DataTable转换为实体集合。

        /// <summary>
        /// 根据反射机制将DataTable转换为实体集合。
        /// </summary>
        /// <typeparam name="T">实体类型。</typeparam>
        /// <param name="dt">DataTable。</param>
        /// <returns>实体集合。</returns>
        public static List<T> ConvertDataTableToModelList<T>(DataTable dt)
        {
            if (dt == null)
            {
                return null;
            }
            List<T> result = new List<T>();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                T t = Activator.CreateInstance<T>();
                ConvertDataRowToModel(t, dt, i);
                result.Add(t);
            }
            return result;
        }

        #endregion 根据反射机制将DataTable转换为实体集合。

        /// <summary>
        /// 通用(调用对象方法前先new一遍对象,故对象的状态无法保留;无用有无参构造函数,并调用无参方法),
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="methodName"></param>
        public static void InvokeMethod<T>(string methodName, object[] param = null) where T : new()
        {
            T instance = new T();
            MethodInfo method = typeof(T).GetMethod(methodName);
            method.Invoke(instance, param);
        }

        /// <summary>
        /// 调用一个具体实例对象的方法,会保留对象状态
        /// </summary>
        /// <param name="o"></param>
        /// <param name="methodName"></param>
        public static void InvokeMethod(object o, string methodName, object[] param = null)
        {
            o.GetType().GetMethod(methodName).Invoke(o, param);
        }
    }
}

[转载]无法将 NULL 转换成“System.DateTime”,因为它是一种值类型 - 我心飞翔 - BlogJava

mikel阅读(1371)

[转载]无法将 NULL 转换成“System.DateTime”,因为它是一种值类型 – 我心飞翔 – BlogJava.

C# 2.0里面的数据类型中,分为值类型和引用类型,引用类型可以初始化为null,可是值类型是不可以的。

比如经常用到的System.Guid类型,要么赋值为Guid.NewId,要么赋值为Guid.Empty。
再比如System.DateTime,默认初始化为DateTime.MinValue。

强行给值类型赋null值,编译就不会通过,会报出类似下面的异常:
错误 1 无法将 NULL 转换成“System.DateTime”,因为它是一种值类型
这个时候就要借助Nullable<T>结构体了。

拿DateTime举例,完整的写法:
Nullable<DateTime> now = DateTime.Now;
Nullable<DateTime> now = null;
当然也可以缩写:
DateTime? now = DateTime.Now;
DateTime? now = null;
我们可以直接对now赋值,但实际上是给now.Value赋值。

既然可以为空,就涉及到判断了,以下两种方式都是可行的:
if (now != null) {}
if (now.HasValue()) {}
有一点需要注意的是,值类型可以通过这种方法变成引用类型,但是引用类型不可以哟。比如下面这段代码:
Nullable<string> test = “ddd”;
这段代码编译无法通过,会报出以下异常:
错误 1 类型“string”必须是不可为空的值类型才能用作泛型类型或方法“System.Nullable<T>”中的参数“T”

做自媒体应该有自己的根据地

mikel阅读(1071)

最近QQ空间频繁被禁止的日志让很多人很郁闷,就像想说话被别人给堵住了嘴那么难受!很多人都已经养成了坚持写日志的习惯,可万万没想到腾讯审查如此严格,结果被错杀的有很多,甚至微博都发不出去了!又有多少人不得不一声叹息下改投其他平台?

所以说做自媒体总是依赖别人的平台终究不是长久之计,怎么也得有个自己的独立博客才行,其实很多人都证明了这一点儿,并做得很好,网赚圈里面就很流行自己的独立博客写网赚操作项目的日志等等方式,这就很好没有限制想写啥就写啥,也显得很真实不至于因为迎合什么审查规则,将一篇好好的文章改的面目全非,结果读者读的都一头雾水。

从程序员的角度也应该有自己的独立博客来积累自己日常开发中的经验总结之类的,以备自己日后查阅,毕竟每次解决问题的经验都是宝贵的,所以说要有自己的根据地!

[转载]ASP.NET MVC 系列:使用Flurl制作可复用的分页组件 - >>王刚 - 博客园

mikel阅读(1129)

[转载]ASP.NET MVC 系列:使用Flurl制作可复用的分页组件 – >>王刚 – 博客园.

使用ASP.NET MVC查询时,一直使用MvcPaging组件,虽然需要自定义MvcPaging.Pager才能达到我想要的效果,但在没有较好的URL库时,还是这么用。分页的逻辑本来就不复杂,更重要的是最近发现了Flurl这个开源库,所以采用Flurl制作一个DIY的分页组件,核心是PagingModel文件,算法可能不是最优,但包含了主要的逻辑和实现关键点。由于在查询方面,我使用以下实践:

1.使用ViewModel封装查询参数

2.使用ViewModel作为View的Model类型

3.采用表单的GET方式提交查询到Action

4.直接设置Url的参数提交查询到Action

因此自制的分页组件也在上述环境下应用。本来计算将查询和分页写在一起,但是为了便于独立演示分页还是将分页部分独立出来。

1.首先使用String扩展方法包装Flurl中的方法,便于以后更换其他库。

2.自定义继承自IHtmlString的对象PagingModel,这样可以不依赖MVC的程序库。同时实现了IvalidatableObject接口,检查PageSize异常。一些默认的参数可以配置成从配置文件(在ASP.NET MVC 系列:文件上传的Demo有相关的代码)或配置数据库中读取。

3.在ASP.NET MVC Razor中直接使用或使用HtmlHelper扩展方法包装调用。可以对类库再次保证,引用ASP.NET MVC,这样可以直接返回SelectList对象。

Action:

View:

4.可以不使用继承自PagingModel的方式,直接在View中new 一个PagingModel方式,如:

5.效果演示:

(1)靠近首页和末页的链接数不足时,会向中间补全。博客园的导航就只处理了靠近首页部分,没有正确处理末页部分。

(2)默认PageIndex和PageSize不会添加参数。Url中参数为空时会自动过滤掉。

Demo:点击下载

如果这篇博客内容对您稍有帮助或略有借鉴,请您推荐它帮助更多的人。

[转载]C# 微信 生活助手 空气质量 天气预报等 效果展示 数据抓取 (一) - 开心生活助手 - 博客园

mikel阅读(1290)

[转载]C# 微信 生活助手 空气质量 天气预报等 效果展示 数据抓取 (一) – 开心生活助手 – 博客园.

第一次在博客园写博客写的不好,大家见谅。最近工作辞了,然后感冒发烧输了一个星期的液,感觉很烦躁,心情不是很好,在帝都感觉压力大,废话不说了开始正题把!

还没有完全完成,后续考虑开源!

可以关注微信公众帐号体验一下先看下 效果把

 

先介绍下工具 我用的有 httpwatch,fiddler

 

国家环保部的数据链接 http://datacenter.mep.gov.cn/report/air_daily/airDairyCityHour.jsp

原以为直接get请求就可以了 试了下 发现没有获取了 然后看了下代码 发现

<script type="text/javascript">// <![CDATA[
    function submitForm(){
        document.citydayform.submit();
    }
// ]]></script>

<form style="margin: 0px auto 0px auto;" action="http://datacenter.mep.gov.cn:80/report/air_daily/airDairyCityHour.jsp" method="post" name="citydayform">
<table class="font" border="1" width="95%" cellspacing="0" cellpadding="0" align="center">
<tbody>
<tr>
<td class="STYLE1" align="right" bgcolor="#FFFFEF" width="5%" height="30">城市:</td>
<td bgcolor="#FFFFFF" width="8%">
<input name="city" type="text" value="" /></td>
<td class="STYLE1 STYLE1" align="right" bgcolor="#FFFFEF" width="5%" height="30">时间:</td>
<td bgcolor="#FFFFFF" width="30%">  从:
<input id="startdate" class="Wdate" style="text-align: center; cursor: pointer; width: 160px; height: 21px; margin-top: 0px;" name="startdate" readonly="readonly" type="text" value="2015-04-16 22:00" />
到:
<input id="enddate" class="Wdate" style="text-align: center; cursor: pointer; width: 160px; height: 21px; margin-top: 0px;" name="enddate" readonly="readonly" type="text" value="2015-04-16 22:00" /></td>
<td bgcolor="#FFFFFF" width="8%">
<div align="center"><input height="19" src="/report/main/images/search.gif" type="image" width="83" /></div></td>
</tr>
</tbody>
</table>
</form>

模型

复制代码

public partial class AirQuality
{
public int Id { get; set; }
public System.DateTime Time { get; set; }
public int AQI { get; set; }
public int CityCode { get; set; }
public string Level { get; set; }
public string PrimaryPollutant { get; set; }
}

抓取代码,通过正则匹配数据

复制代码

while (true)
{
string param = string.Format("city=&amp;startdate={0}&amp;enddate={1}&amp;page={2}", lastGrabHBTime.AddHours(1).ToString("yyyy-MM-dd HH:mm"), currentTime.ToString("yyyy-MM-dd HH:mm"), pageIndex);
#region 数据抓取
while (true)
{
try
{
res = HttpHelper.PostRequest(Constant.HBUrl, param, Encoding.GetEncoding("GB2312"));
break;
}
catch (Exception)
{
Thread.Sleep(1000);
}
}
#endregion
res = Regex.Replace(res, "[\r\n|\t]", "").Replace(" ", " ");
var matches = regex.Matches(res);
if (matches.Count == 0)
break;
foreach (Match match in matches)
{
var group = match.Groups;
if (group.Count == 10)
{
var air = new AirQuality()
{
Time = DateTime.Parse(group[3].Value),
AQI = int.Parse(group[5].Value),
Level = group[7].Value,
PrimaryPollutant = group[9].Value,
CityCode = cityConfigs.FirstOrDefault(p =&gt; p.City == group[1].Value).Code
};
airQualities.Add(air);
}
}
pageIndex++;
Thread.Sleep(100);
}

POST请求代码

public static string PostRequest(string url, string param, string cookie = "")
{
return PostRequest(url, param, Encoding.UTF8, cookie);
}
public static string PostRequest(string url, string param, Encoding encoding, string cookie = "")
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url));
request.ContentType = "application/x-www-form-urlencoded";
request.UserAgent = "Mozilla/5.0 (MSIE 9.0; Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko";
request.Method = "post";
request.Timeout = 30000;
request.KeepAlive = false;
if (!string.IsNullOrEmpty(cookie))
{
request.Headers[HttpRequestHeader.Cookie] = cookie;
}
byte[] bytes = encoding.GetBytes(param);
request.ContentLength = bytes.Length;
using (Stream stream = request.GetRequestStream())
{
stream.Write(bytes, 0, bytes.Length);
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (Stream stream = response.GetResponseStream())
{
StreamReader reader = new StreamReader(stream, encoding);
return reader.ReadToEnd();
}
}

微信公众帐号获取最新更新微信号kxshzsQQ:519872449 QQ群:77877965开心编程交流群

58和赶集要在一起 剩者为王?!

mikel阅读(1049)

各大媒体都在报道这个消息,58同城和赶集网合并的新闻一下子让58的股价飙升,

“赶集网的用户是我们用户的子集,商户也是我们的子集,产品也是copy我们的,收购这样一家公司没有任何意义。”(详见钛媒体文章《姚劲波谈收购赶集:我们不会收购一个没有意义的公司》)。

过去曾经嗤之以鼻的姚劲波为何要和赶集在一起?

“在两边同时下注和投资了的老虎基金,目前正在积极推动此事。”这一句基本上道破了玄机,资本运作的世界里是没有胜负,只有利润,看来分类信息的大格局基本上已定,老虎基金是最大的赢家,至于分类信息面对BAT的O2O攻势是怎么布局的,就看58以后的动作了,从目前收购了多家O2O的公司来看,基本上都在挖掘本地需求为寻找引爆资本找故事。

对于消费者合并是好事儿,不用发愁哪家的信息全,哪家商家多了,反正都是一家数据共享吧!至于商家来说各有利弊,收费永远都是商家不能言说的痛,尽管合并了可是钱是一分钱都不能少的,想要占据本地分类信息的一角,那就掏腰包吧!从团购的剩者为王的前车之鉴就可以看出来,最终不管谁留下,都少不了要盈利这个不变的主题,说实在的窝窝团我真不知道和美团有什么差别,他俩儿为什么不能走到一起呢?!

 

ORM存储过程和实体类代码生成工具

mikel阅读(1020)

ORM存储过程和实体类生成工具

自己写的一个ORM框架的存储过程和实体类生成工具,具体界面如下:

orm

操作步骤:

1.设置数据库连接:

2.选择要生成的表或视图:

3.选择要生成的存储过程类型:

4.如果是视图需要输入主键名和操作的表:

5.点击生成存储过程,自动创建存储过程到数据库中

6.生成实体类需要输入类名和命名空间:

7.点击生成实体类,可以生成实体类复制文本框中的代码到项目的类文件中保存

 

下载地址:ORMTools

源码下载:http://pan.baidu.com/s/1i37YiIp

 

[转载]如何从SQL Server 中取得字段说明 - Goodspeed - 博客园

mikel阅读(1255)

[转载]如何从SQL Server 中取得字段说明 – Goodspeed – 博客园.

SQL Server 2000

你可以在企业管理器中增加字段说明,也可以使用下面的代码:

EXEC sp_addextendedproperty
MS_Description,
some description,
user,
dbo,
table,
table_name,
column,
column_name

现在,你就可以得到通过下面的代码得到字段说明:

SELECT
[Table Name] = i_s.TABLE_NAME,
[Column Name] = i_s.COLUMN_NAME,
[Description] = s.value
FROM
INFORMATION_SCHEMA.COLUMNS i_s
LEFT OUTER JOIN
sysproperties s
ON
s.id 
= OBJECT_ID(i_s.TABLE_SCHEMA+.+i_s.TABLE_NAME)
AND s.smallid = i_s.ORDINAL_POSITION
AND s.name = MS_Description
WHERE
OBJECTPROPERTY(OBJECT_ID(i_s.TABLE_SCHEMA+.+i_s.TABLE_NAME), IsMsShipped)=0
 AND i_s.TABLE_NAME = ‘table_name’ 
ORDER BY
i_s.TABLE_NAME, i_s.ORDINAL_POSITION

如果你只关心某一张表,那么上面的TSQL中的注释部份对你就非常有帮助。反过来就会给你所有表中的所有字段。

如果你只需要所有有说明的表,你可以把out join 改成 inner join

SELECT
[Table Name] = i_s.TABLE_NAME,
[Column Name] = i_s.COLUMN_NAME,
[Description] = s.value
FROM
INFORMATION_SCHEMA.COLUMNS i_s
INNER JOIN
sysproperties s
ON
s.id 
= OBJECT_ID(i_s.TABLE_SCHEMA+.+i_s.TABLE_NAME)
AND s.smallid = i_s.ORDINAL_POSITION
AND s.name = MS_Description
WHERE
OBJECTPROPERTY(OBJECT_ID(i_s.TABLE_SCHEMA+.+i_s.TABLE_NAME), IsMsShipped)=0
ORDER BY
i_s.TABLE_NAME, i_s.ORDINAL_POSITION

 

SQL Server 2005

在SQL Server 2005 中 sysproperties 表已被废弃,所以上面的代码都不能用。幸运的是他们还是增加了一个系统表给我们 sys.extended_properties,这张表和 sysproperties基本上相似。

SELECT
[Table Name] = OBJECT_NAME(c.object_id),
[Column Name] = c.name,
[Description] = ex.value
FROM
sys.columns c
LEFT OUTER JOIN
sys.extended_properties ex
ON
ex.major_id 
= c.object_id
AND ex.minor_id = c.column_id
AND ex.name = MS_Description
WHERE
OBJECTPROPERTY(c.object_idIsMsShipped)=0
 AND OBJECT_NAME(c.object_id) = ‘your_table’ 
ORDER
BY OBJECT_NAME(c.object_id), c.column_id

和SQL Server 2000一样,你可以使用注释部份来返回某一张表。

Microsoft Access

在Access中,你可以使用下面的ASP代码来得到某一个字段的说明

<%
on error resume next
Set Catalog = CreateObject(ADOX.Catalog)
Catalog.ActiveConnection 
= Provider=Microsoft.Jet.OLEDB.4.0; & _
Data Source=<path>\<file>.mdb

dsc = Catalog.Tables(table_name).Columns(column_name).Properties(Description).Value

if err.number <> 0 then
Response.Write 
&lt; & err.description & &gt;
else
Response.Write 
Description =  & dsc
end if
Set Catalog = nothing
%
>

[转载]string.Format出现异常"输入的字符串格式有误"的解决方法 - 凡夫·俗子 - 博客园

mikel阅读(1578)

[转载]string.Format出现异常”输入的字符串格式有误”的解决方法 – 凡夫·俗子 – 博客园.天在做项目时,碰到一个很奇 怪的问题,我使用string.Format居然报“输入的字符串格式有误”的错误,我调了很久,还是不对,不明白错在哪里,后来还是google了一 下,原来我在字符串中出现了”{“字符。而”{“字符若出现在string.Format中是必需转义的,也就是要用两个”{{“代表一个”{“,同时双 下面把我查找到的解决方法的相关文章一同粘贴出来。

一、转义

C# 中使用类似 {0}, {1:yyyy-MM-dd} 这样的格式占位符,如果被格式化字符串本身包含 { 或者 } 怎么办呢?答案是:用两个 { 或者 }连写表示单个。

例如
string str1 = String.Format(“{{Hello}}, {0}, Now is {{{1:yyyy-MM-dd HH:mm:ss}}}”,
“Jinglecat”,
DateTime.Now); // {Hello}, Jinglecat, Now is {2007-07-18 23:06:35}
string str2 = String.Format(“{Hello}, {0}, Now is {{1:yyyy-MM-dd HH:mm:ss}}”,
“Jinglecat”,
DateTime.Now); // –> System.FormatException: 输入字符串的格式不正确。

事实上,很多情况下带特殊含义的字符都是这样转义的:如,
C#  中,当字符串常量带 @  前导的时候,用两个 ” 连写表示一个 ” (半角双引号)
string str3 = @”My UserName is “”Jinglecat””.”; // My UserName is “Jinglecat”.
//string str4 = @”My UserName’s “Jinglecat””; // error CS1002: 应输入 ;
//string str5 = @”My UserName’s \”Jinglecat\””; // error CS1002: 应输入 ;
SQL 字符串常量,用两个 ‘ 连写表示一个 ‘ (半角单引号)
DECLARE @str6 varchar(100)
SET @str6 = ‘My UserName is ‘‘Jinglecat’‘.’
PRINT @str6 — My UserName is ‘Jinglecat’.
正则表达式中用,两个 $ 连写表示一个 $  (dollar)
二、String Formatting in C#

基本内容是:可以在 Console.WriteLine(以及 String.Format,它被 Console.WriteLine 调用)中的格式字符串内的括号中放入非索引数字的内容。格式规范的完整形式如下:

{index [, width][:formatstring]}

其中,index 是此格式程序引用的格式字符串之后的参数,从零开始计数;width(如果有的话)是要设置格式的字段的宽度(以空格计)。width 取正数表示结果右对齐,取负数则意味着数字在字段中左对齐。(请参阅下面的前两个示例。)

formatstring 是可选项,其中包含有关设置类型格式的格式说明。如果对象实现 IFormattableformatstring 就会传递给对象的 Format 方法(在 Beta 2 和后续版本中,该方法的签名变为 ToString(string, IFormatProvider),但功能不变)。如果对象不实现 IFormattable,就会调用 Object.ToString(),而忽略 formatstring

另请注意,在 Beta 1 中不区分当前语言的 ToString 在 Beta 2 和后续版本中“将”区分语言。例如,对于用“.”分隔千位,用“,”分隔小数的国家,1,234.56 将会格式化成 1.234,56。如果您需要结果无论在什么语言下都是一样的,就请使用 CultureInfo.InvariantCulture 作为语言。

若要获取有关格式的完整信息,请查阅“.NET 框架开发人员指南”中的格式概述(英文)

例如:String.Format(“[{0,-10:0##.#0}]”, 14)=”[014.00    ]”;-10表示左对齐,总共占10位,不够了补空字符。

Strings

There really isn’t any formatting within a strong, beyond it’s alignment. Alignment works for any argument being printed in a String.Format call.

Sample Generates
String.Format(”->{1,10}<-”, “Hello”); -> Hello<-
String.Format(”->{1,-10}<-”, “Hello”); ->Hello <-

Numbers

Basic number formatting specifiers:

Specifier Type Format Output (Passed Double 1.42) Output (Passed Int -12400)
c Currency {0:c} $1.42 -$12,400
d Decimal (Whole number) {0:d} System.FormatException -12400
e Scientific {0:e} 1.420000e+000 -1.240000e+004
f Fixed point {0:f} 1.42 -12400.00
g General {0:g} 1.42 -12400
n Number with commas for thousands {0:n} 1.42 -12,400
r Round trippable {0:r} 1.42 System.FormatException
x Hexadecimal {0:x4} System.FormatException cf90

注:{0:n2}表示千位用,隔开小说点后面两位

Custom number formatting:

Specifier Type Example Output (Passed Double 1500.42) Note
0 Zero placeholder {0:00.0000} 1500.4200 Pads with zeroes.
# Digit placeholder {0:(#).##} (1500).42
. Decimal point {0:0.0} 1500.4
, Thousand separator {0:0,0} 1,500 Must be between two zeroes.
,. Number scaling {0:0,.} 2 Comma adjacent to Period scales by 1000.
% Percent {0:0%} 150042% Multiplies by 100, adds % sign.
e Exponent placeholder {0:00e+0} 15e+2 Many exponent formats available.
; Group separator see below

The group separator is especially useful for formatting currency values which require that negative values be enclosed in parentheses. This currency formatting example at the bottom of this document makes it obvious:

注:

如果相应的数字是前导零或尾随零,“#”字符就会替换为空值。无论相应数字的值如何,“0”字符都会被替换为零字符 — 因此,数字将会被零填补。句号(如果有的话)表示小数分隔符的位置。

那么,为什么要同时使用这些字母,比如“###0.##”? 如果要设置格式的值恰好为零,“#” 图片字符就被替换为“无”(连零字符也不是)。您可能“总是”希望在小数点的左边至少有一个“0”,否则,如果值为零,字段就没有输出。换言之,仅包含 “#”字符,一个“0”也没有的格式常被认为是一个编程错误。

例如

string.Format(“{0:###.##},14″)=”14”;

string.Format(“{0:0##.#0},14″)=”014.00”

Dates

Note that date formatting is especially dependant on the system’s regional settings; the example strings here are from my local locale.

Specifier Type Example (Passed System.DateTime.Now)
d Short date 10/12/2002
D Long date December 10, 2002
t Short time 10:11 PM
T Long time 10:11:29 PM
f Full date & time December 10, 2002 10:11 PM
F Full date & time (long) December 10, 2002 10:11:29 PM
g Default date & time 10/12/2002 10:11 PM
G Default date & time (long) 10/12/2002 10:11:29 PM
M Month day pattern December 10
r RFC1123 date string Tue, 10 Dec 2002 22:11:29 GMT
s Sortable date string 2002-12-10T22:11:29
u Universal sortable, local time 2002-12-10 22:13:50Z
U Universal sortable, GMT December 11, 2002 3:13:50 AM
Y Year month pattern December, 2002

The ‘U’ specifier seems broken; that string certainly isn’t sortable.

Custom date formatting:

Specifier Type Example Example Output
dd Day {0:dd} 10
ddd Day name {0:ddd} Tue
dddd Full day name {0:dddd} Tuesday
f, ff, … Second fractions {0:fff} 932
gg, … Era {0:gg} A.D.
hh 2 digit hour {0:hh} 10
HH 2 digit hour, 24hr format {0:HH} 22
mm Minute 00-59 {0:mm} 38
MM Month 01-12 {0:MM} 12
MMM Month abbreviation {0:MMM} Dec
MMMM Full month name {0:MMMM} December
ss Seconds 00-59 {0:ss} 46
tt AM or PM {0:tt} PM
yy Year, 2 digits {0:yy} 02
yyyy Year {0:yyyy} 2002
zz Timezone offset, 2 digits {0:zz} -05
zzz Full timezone offset {0:zzz} -05:00
: Separator {0:hh:mm:ss} 10:43:20
/ Separator {0:dd/MM/yyyy} 10/12/2002

Enumerations

Specifier Type
g Default (Flag names if available, otherwise decimal)
f Flags always
d Integer always
x Eight digit hex.

Some Useful Examples

String.Format(”{0:$#,##0.00;($#,##0.00);Zero}”, value);

This will output “$1,240.00″ if passed 1243.50. It will output the same format but in parentheses if the number is negative, and will output the string “Zero” if the number is zero.

String.Format(”{0:(###) ###-####}”, 8005551212);

This will output “(800) 555-1212″.