5月 31

log4net是log4j的.NET版本

强大的功能什么的就不写了

最大的特色是只要再config文件中做配置就可以使用了

但是在我的小项目中,实在没有太大的必要,每次看到这些复杂的配置,多出来的一个配置文件就觉得麻烦,所以研究了一下全部在C#代码中实现

废话不说,直接上代码

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using log4net.Repository.Hierarchy; 
using log4net; 
using log4net.Layout; 
using log4net.Appender; 
using log4net.Core; 
  
namespace HeYang.Framework.Helper 
{ 
  
    public class LogHelper 
    { 
        static LogHelper() 
        { 
            Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository(); 
  
            PatternLayout patternLayout = new PatternLayout(); 
            patternLayout.ConversionPattern = "【%d】【%p】 - %m%n"; 
            patternLayout.ActivateOptions(); 
  
            RollingFileAppender roller = new RollingFileAppender(); 
            //roller.AppendToFile = false; 
            roller.File = @"Logs\"; 
            roller.Layout = patternLayout; 
            roller.DatePattern = "yyyy.MM.dd'.log'"; 
            roller.RollingStyle = RollingFileAppender.RollingMode.Date; 
            roller.StaticLogFileName = false; 
            roller.LockingModel = new log4net.Appender.FileAppender.MinimalLock(); 
            roller.ActivateOptions(); 
            hierarchy.Root.AddAppender(roller); 
  
  
            hierarchy.Root.Level = Level.All; 
            hierarchy.Configured = true; 
            logger = log4net.LogManager.GetLogger("logger"); 
        } 
  
        static log4net.ILog logger = null; 
  
  
  
  
  
  
        public static void Error(string message) 
        { 
            logger.Error(message); 
        } 
        //public static void Error(string format, params object[] args) 
        //{ 
        //    Error(string.Format(format, args)); 
        //} 
        public static void Error(Exception exception) 
        { 
            Error(exception.Message); 
        } 
  
  
  
  
        public static void Info(string message) 
        { 
            logger.Info(message); 
        } 
        //public static void Info(string format, params object[] args) 
        //{ 
        //    Info(string.Format(format, args)); 
        //} 
        public static void Info(Exception exception) 
        { 
            Info(exception.Message); 
        } 
  
  
        public static void Warn(string message) 
        { 
            logger.Warn(message); 
        } 
        //public static void Warn(string format, params object[] args) 
        //{ 
        //    Warn(string.Format(format, args)); 
        //} 
        public static void Warn(Exception exception) 
        { 
            Warn(exception.Message); 
        } 
  
  
    } 
  
}

 

记录一下Message的转换

 

log4net.Layout.PatternLayout中的转换模式(ConversionPattern)

%m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息

%n(new line):换行

%d(datetime):输出当前语句运行的时刻

%r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数

%t(thread id):当前语句所在的线程ID

%p(priority): 日志的当前优先级别,即DEBUGINFOWARN…

%c(class):当前日志对象的名称,例如:

       模式字符串为:%-10c -%m%n

       代码为:

ILog log=LogManager.GetLogger(“Exam.Log”);

log.Debug(“Hello”);

    则输出为下面的形式:

Exam.Log       – Hello

%L:输出语句所在的行号

%F:输出语句所在的文件名

%-数字:表示该项的最小长度,如果不够,则用空格填充

例如,转换模式为%r [%t]%-5p %c – %m%n  PatternLayout 将生成类似于以下内容的输出:

176 [main] INFO  org.foo.Bar – Located nearest gas station.

 

written by ocean

5月 30

在SQL Server里执行以下命令,来启用SQLCLR

EXEC sp_configure 'clr enabled',1 --1,启用clr 0,禁用clr         
              
RECONFIGURE WITH OVERRIDE --不加 WITH OVERRIDE在SQL Server 2008 R2上運行不通過

设置数据库信任

ALTER DATABASE BPMDBTemp SET TRUSTWORTHY ON 
ALTER DATABASE IPRSHQ_New SET TRUSTWORTHY ON

添加程序集

CREATE ASSEMBLY [SQLCLR.IPRS]
FROM 'D:\Test\IPRSTest.Test\SQLCLR.IPRS\bin\Debug\SQLCLR.IPRS.dll'
WITH PERMISSION_SET = SAFE
GO

创建调用函数

CREATE PROCEDURE [dbo].[clr_GetCapexUBAmount]
@employeeNum [int]
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [SQLCLR.IPRS].[StoredProcedures].fn_GetCapexUBAmount2
GO

执行,其实是一样的

exec [clr_GetCapexUBAmount] 99110378;

如果要删除程序集

drop proc [clr_GetCapexUBAmount];
drop assembly [SQLCLR.IPRS]

整个程序集的包裹程序

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using SQLCLR.IPRS;
using System.Collections;


public partial class StoredProcedures
{ 

    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void fn_GetCapexUBAmount2(SqlInt32 employeeNum)
    {
        FunGetCapexUBAmount fun = new FunGetCapexUBAmount();
        fun.Start((int)employeeNum); 

        SqlDataRecord dataRecord = new SqlDataRecord(new SqlMetaData[] { 
            new SqlMetaData("VPUtilized", SqlDbType.Decimal ),
            new SqlMetaData("SVPUtilized", SqlDbType.Decimal) ,
            new SqlMetaData("EVPUtilized", SqlDbType.Decimal) ,
            new SqlMetaData("COOUtilized", SqlDbType.Decimal) ,
            new SqlMetaData("ApprovableAmount", SqlDbType.Decimal) ,
            new SqlMetaData("FirstLevel", SqlDbType.VarChar,100) ,
            new SqlMetaData("VPNum", SqlDbType.Int) ,
            new SqlMetaData("SVPNum", SqlDbType.Int) ,
            new SqlMetaData("EVPNum", SqlDbType.Int) ,
            new SqlMetaData("COONum", SqlDbType.Int) 
                }); 
        dataRecord.SetDecimal(0, fun.result.VPUtilized);
        dataRecord.SetDecimal(1, fun.result.SVPUtilized);
        dataRecord.SetDecimal(2, fun.result.EVPUtilized);
        dataRecord.SetDecimal(3, fun.result.COOUtilized);
        dataRecord.SetDecimal(4, fun.result.ApprovableAmount);
        dataRecord.SetValue(5, fun.result.FirstLevel);
        dataRecord.SetInt32(6, fun.result.VPNum);
        dataRecord.SetInt32(7, fun.result.SVPNum);
        dataRecord.SetInt32(8, fun.result.EVPNum);
        dataRecord.SetInt32(9, fun.result.COONum); 
        SqlContext.Pipe.Send(dataRecord); 
    }
}

前面的方式是返回单行,并且最终包装成一个stored procedure,如果要包装成function呢

包裹程序

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SqlServer.Server;
using System.Collections;
using System.Diagnostics;
using System.Data.SqlTypes;
using SQLCLR.IPRS;
public class ApproveAmount
{
    [SqlFunction(FillRowMethodName = "FillRow", DataAccess = DataAccessKind.Read)]
    // TableDefinition = "VPUtilized numeric(18,5),SVPUtilized numeric(18,5),EVPUtilized numeric(18,5),COOUtilized numeric(18,5),ApprovableAmount Numeric(18,5),FirstLevel varchar(10),VPNum varchar(10),SVPNum varchar(10),EVPNum varchar(10),COONum varchar(10)")]  
    public static IEnumerable InitMethod(SqlInt32 employeeNum)
    {
        FunGetCapexUBAmount fun = new FunGetCapexUBAmount();
        fun.Start((int)employeeNum);

        List<ResultInfo> list = new List<ResultInfo>();
        list.Add(fun.result);

        return list;
    } 
    public static void FillRow(object obj, out decimal VPUtilized
        , out decimal SVPUtilized
        , out decimal EVPUtilized
        , out decimal COOUtilized
        , out decimal ApprovableAmount
        , out SqlString FirstLevel
        , out SqlString VPNum
        , out SqlString SVPNum
        , out SqlString EVPNum
        , out SqlString COONum)
    {
        ResultInfo row = (ResultInfo)obj;
        VPUtilized = row.VPUtilized;
        SVPUtilized = row.SVPUtilized;
        EVPUtilized = row.EVPUtilized;
        COOUtilized = row.COOUtilized;
        ApprovableAmount = row.ApprovableAmount;
        FirstLevel = new SqlString(row.FirstLevel);
        VPNum = new SqlString(row.VPNum == 0 ? "" : row.VPNum.ToString());
        SVPNum = new SqlString(row.SVPNum == 0 ? "" : row.SVPNum.ToString());
        EVPNum = new SqlString(row.EVPNum == 0 ? "" : row.EVPNum.ToString());
        COONum = new SqlString(row.COONum == 0 ? "" : row.COONum.ToString());
    }
}

添加程序集,其实是一样的

CREATE ASSEMBLY [SQLCLR.IPRS] FROM 
'D:\Test\IPRSTest.Test\SQLCLR.IPRS\bin\Debug\SQLCLR.IPRS.dll'WITH PERMISSION_SET = SAFEGO

创建调用函数

CREATE FUNCTION clr_GetCapexUBAmount(@employeeNum int)
RETURNS TABLE 
(
    VPUtilized numeric(18,5)
    ,SVPUtilized numeric(18,5)
    ,EVPUtilized numeric(18,5)
    ,COOUtilized numeric(18,5)
    ,ApprovableAmount Numeric(18,5)
    ,FirstLevel   NVARCHAR (MAX)
    ,[VPNum]  NVARCHAR(MAX),
    [SVPNum]  NVARCHAR(MAX),
    [EVPNum]  NVARCHAR(MAX),
    [COONum]  NVARCHAR(MAX)
)
AS 
EXTERNAL NAME [SQLCLR.IPRS].[ApproveAmount].InitMethod
GO

调用

SELECT * FROM clr_GetCapexUBAmount(99110378)

written by ocean

5月 23

在做文学乐网站右侧的列表的时候,遇到一点问题,

div会被撑爆掉

网上找了一个div自适应高度的css,记录一下

 

在IE6中,如果子容器的高度超过父容器的时候,父容器会被子容器撑开,所以我们可以直接设置一个height的高度值即可。但是在IE7和firefox就不行了,它不会自动撑开。

 如果要设置DIV自适应高度,我们可以采用height:auto;这个属性;不过这个属性IE6又不支持了。是不是很头痛?其实解决这个问题不难,而且方法也不少,这里推荐一种:(假设我们需要控制的这个DIV最小高度是100px,超过时就让里面的信息自动撑开):

.div{     
    height:auto!important;     
    height:100px;     
    min-height:100px;     
}

 

注释:因为!important在IE7和Firefox都可以读到,而且权重高于后面的height:100px;所以当在IE7和Firefox显示的时候,就会用了前面的height:auto!important;而IE6识别不了!important,auto对它也不管用,因此会应用了后面的height:100px的样式;而min-height:100px表示DIV最小高度为100px;此属性在IE7和firefox都可以识别。

 

而在IE8和chrome当中,上述方法是不行的。

想要实现必须在撑高的div下面加个空div

<div style="clear:both"></div>

 

written by ocean

5月 22

AJAX经常会用,一般都是传输数据到前端,JAVAScript拼接数据成HTML加载到Dom数中

或者后台cs中直接拼接成HTML到前端,这样写起来就比较麻烦了,毕竟没有aspx页面中实现的html方便

但是如果每个Request做成一个aspx不够优雅,这个时候如果用ascx来实现就比较不错了

 

调用的时候传递对应的ascx路径,实现起来比较不错,研究了一下,记录下来

 

因为ascx不能直接执行,所以需要有一个容器,这里选择使用ashx

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.IO; 
  
namespace blog.wx6.org.WebApplication 
{ 
    /// <summary> 
    /// Summary description for AjaxGetHtml 
    /// </summary> 
    public class AjaxGetHtml : IHttpHandler 
    {   
  
        public void ProcessRequest(HttpContext context) 
        { 
            context.Response.ContentType = "text/html"; 
  
            if (context.Request["control"] != null) 
            { 
                var controlPath= context.Request["control"].ToString();   
                string resultHTML = string.Empty; 
                Page page = new Page(); 
                try
                {  
                    Control control = page.LoadControl(controlPath);  
                    page.Controls.Add(control);  
                    StringWriter stringWriter = new StringWriter(); 
                    HttpContext.Current.Server.Execute(page, stringWriter, true); 
                    resultHTML = stringWriter.ToString(); 
                } 
                catch (Exception ex) 
                { 
                    throw ex; 
                } 
                finally
                { 
                    page.Dispose(); 
                } 
                context.Response.Write(resultHTML); 
            }   
        }   
  
        public bool IsReusable 
        { 
            get
            { 
                return false; 
            } 
        }   
  
    } 
}

前端调用,就是很普通的ajax调用,只不过会传递一个叫  "control" 的参数,用来标识所属的用户控件

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title></title> 
    <script src="jquery-1.4.1.min.js" type="text/javascript"></script> 
    <script> 
        $(document).ready(function () { 
            $.get("/AjaxGetHtml.ashx", 
            { control: "~/UserControls/Test.ascx",a:"aaa" ,b:"bbb"}, 
             function (data) { 
                 $("#show").html(data); 
             }); 
        });  
    </script> 
</head> 
<body>  
<div id="show"></div> 
  
</body> 
</html>

其中传递了两个参数  a和b

 

最后就是ascx页面的实现了,和普通ascx没有任何区别

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
  
namespace blog.wx6.org.WebApplication.UserControls 
{ 
    public partial class Test : System.Web.UI.UserControl 
    {  
        public string AAA { get; set; } 
        public string BBB { get; set; }  
        protected void Page_Load(object sender, EventArgs e) 
        { 
            this.AAA = Request.QueryString["a"]; 
            this.BBB = Request.QueryString["b"]; 
        } 
    } 
} 
  
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Test.ascx.cs" Inherits="blog.wx6.org.WebApplication.UserControls.Test" %> 
Test <br /> 
Result:<%=this.AAA %> and <%=this.BBB %>

 

 

written by ocean

5月 22

经常会有一些好用的工具在无意间发现

但是因为不是立即需要又有慢慢的失去

在此立个帖子做专门的集合吧

反编译工具

ILSPY

http://ilspy.net/

比Reflector好用,关键是开源,免费

VS2012下载

下载地址和激活key:
32位: 快传下载
SHA1:C01EEF4C6B10F654257748197F3A8E50B2BFD58B
64位: 快传下载
SHA1:A0BDC3F1D1534AA92D72FEF80D837A04969B752F
下载完成后,推荐验证Sha1值,以保证所下载资源为纯净的微软原版,推荐使用 – Hash MD5 点击此处下载
Visual Studio 2012 Ultimate 旗舰版序列号:
YKCW6-BPFPF-BT8C9-7DCTH-QXGWC    
YQ7PR-QTHDM-HCBCV-9GKGG-TB2TM
按照后,点击帮助(help)-注册产品(Register
Product)-输入Key

win8 企业版神key

7NKFG-64QDF-4PGMR-KP74B-VQR92
GCVN9-Y429G-P79T9-WWXJG-YG667

written by ocean

5月 22

值得学习借鉴的代码类库

Apworks框架
地址  : http://www.cnblogs.com/daxnet/archive/2013/05/10/3072090.html

幸福框架

http://www.cnblogs.com/happyframework/

ASP.NET MVC框架

http://www.cnblogs.com/fish-li/archive/2012/02/12/2348395.html

written by ocean