.Net与Java时间处理上的一点区别

这两天在做与某知名一卡通公司的单点登录集成(我们的产品使用Java编写,对方的程序使用.Net编写)其中有一项参数是时间戳。即当前时间相对于公元1970-1-1 00:00:00的秒数。按照他们给出的文档我完成了Java部分的编写,时间戳部分很简单,一句话:

[codesyntax lang=”php”]

    private String createTimestamp() //timestamp
    {
        return System.currentTimeMillis() / 1000 + "";
    }

[/codesyntax]

使用System.currentTimeMillis()方法就能得到自1970年1月1日0时0分0秒的毫秒数,除以1000自然是秒数。但是意外却发生了,我产生的时间戳跟他们公司产生的时间戳差了一大截,查阅资料后发现.Net跟Java在处理时间上有出入。

.Net产生的时间都是当前时区的当前时间,而Java的currentTimeMillis()方法得到的却是相对于GMT来的时间。中国所在时区是+8区,故时间整整差了8小时!

所以当童鞋们再遇到.Net跟Java时间不一致的时候,多往时区方面考虑考虑,说不定就能找到解决办法了 :)

当然我会给出解决方案:

方法一:JVM运行时增加参数,指定时区 -D user.timezone=GMT+08

方法二:直接在程序中设置时区。System.setProperty(“user.timezone”,”GMT +08″);

方法三:直接加上28800就好了(8hours*60min*60sec=28800)

C# FormsAuthentication的用法

[codesyntax lang=”csharp”]

using System;
using System.Web;
using System.Web.Security;

namespace AuthTest
{
    public class Authentication
    {
        /// <summary>
        /// 设置用户登陆成功凭据(Cookie存储)
        /// </summary>
        /// <param name="UserName">用户名</param>
        /// <param name="PassWord">密码</param>
        /// <param name="Rights">权限</param>
        public static void SetCookie(string UserName,string PassWord,string Rights)
        {
            //
            //String PassWord="test";
            //
            String UserData = UserName + "#" + PassWord+"#"+Rights;
            if (true)
            {
                //数据放入ticket
                FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, UserName, DateTime.Now, DateTime.Now.AddMinutes(60), false, UserData);
                //数据加密
                string enyTicket = FormsAuthentication.Encrypt(ticket);
                HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, enyTicket);
                HttpContext.Current.Response.Cookies.Add(cookie);
            }
        }
        /// <summary>
        /// 判断用户是否登陆
        /// </summary>
        /// <returns>True,Fales</returns>
        public static bool isLogin()
        {
            return HttpContext.Current.User.Identity.IsAuthenticated;
        }
        /// <summary>
        /// 注销登陆
        /// </summary>
        public static void logOut()
        {
            FormsAuthentication.SignOut();
        }
        /// <summary>
        /// 获取凭据中的用户名
        /// </summary>
        /// <returns>用户名</returns>
        public static string getUserName()
        {
            if (isLogin())
            {
                string strUserData = ((FormsIdentity)(HttpContext.Current.User.Identity)).Ticket.UserData;
                string[] UserData = strUserData.Split('#');
                if (UserData.Length != 0)
                {
                    return UserData[0].ToString();
                }
                else
                {
                    return "";
                }
            }
            else
            {
                return "";
            }
        }
        /// <summary>
        /// 获取凭据中的密码
        /// </summary>
        /// <returns>密码</returns>
        public static string getPassWord()
        {
            if (isLogin())
            {
                string strUserData = ((FormsIdentity)(HttpContext.Current.User.Identity)).Ticket.UserData;
                string[] UserData = strUserData.Split('#');
                if (UserData.Length!=0)
                {
                    return UserData[1].ToString();
                }
                else
                {
                    return "";
                }
            }
            else
            {
                return "";
            }
        }
        /// <summary>
        /// 获取凭据中的用户权限
        /// </summary>
        /// <returns>用户权限</returns>
        public static string getRights()
        {
            if (isLogin())
            {
                string strUserData = ((FormsIdentity)(HttpContext.Current.User.Identity)).Ticket.UserData;
                string[] UserData = strUserData.Split('#');
                if (UserData.Length!=0)
                {
                    return UserData[2].ToString();
                }
                else
                {
                    return "";
                }
            }
            else
            {
                return "";
            }
        }
    }
}

[/codesyntax]

点击下载:Authentication.cs

关于asp,aspx页面空白(乱码)的解决方法

有时候明明写好了程序,可是访问时一片空白,而查看源文件发现要进行输出显示的内容已经在源文件中了,这是怎么一回事?多数情况下,这是由于编码造成的问题,比如页面的文件编码跟在html中指定的编码不一致,比如从数据库读取过来的数据编码跟前台显示的不一致,而如果你认为都一致啦,但是他还是不显示,怎么办呢?试试在文件头部加上如下的语句吧!

To Asp:

[codesyntax lang=”asp”]

<%Session.CodePage=65001%>
'此外还有下面的这些常用编码
<%@ codepage=936%>简体中文
<%@ codepage=950%>繁体中文
<%@ codepage=65001%>UTF-8

[/codesyntax]

To Aspx:

[codesyntax lang=”csharp”]

Session.CodePage = Codepage

Codepage取值如下:
0 = UTF-8
874 = Thai Windows
1252 = American English
932 = Japanese

[/codesyntax]

Windows 7下解除VS 2008 90天试用的方法

今天才发现我的VS2008装了SP1以后还没有激活,变成了试用版。想用以前的办法在添加删除程序里输入序列号的方法竟然失效,在Win7该显示序列号输入框的地方竟然什么东西都没有~~查了半天资料,甚至在微软的MSDN讨论区中查了半天,得到的结果竟然是需要修改文件,然后重装VS2008。汗……这么费时费力的事情Kaisir是坚决不会做的。又是一阵搜索,终于找到了一个补丁~~使用方法也很简单:

1)打开“控制面板”–“添加删除功能”–找到Visual Studio2008–点击修改删除。

2)在出现“Microsoft Visual Studio 2008 安装程序 -维护页”这个窗口时,以管理员身份运行我给的补丁。

3)点击右上角的“Bug 微软”按钮。回到“维护页” 下方就会出来一个可供输入序列号的输入框。输入正式版序列号。

4)Done.

点此下载:CrackVS2008ForWindows7

当然,出于版权的原因,序列号我就不提供了,大家各显神通好了啦~~嘿嘿。

(本文软件,图片来源自:真有意思–三脚猫的部落格)

SqlCommand SqlDataAdapter DataSet 等相关概念的解释(转)

sqlconnection数据库连接对象:只有联接才能进行其它操作
sqldataadapter数据适配器对象,就是用某个sqlconnection,执行某个查询语句(SELECT语句),放到某个DataSet里
sqlcommand 数据命令对象(SELECT,INSERT,DELETE,UPDATE等,还可以是存储过程) SqlCommand.Parameter属性传sql参数
ExecuteScalar :执行查询,返回单个字段,比如求和的结果,平均值,最大最小值等等
ExecuteReader执行快速只读向前查询,一般对单条记录的多个字段逐个查询,多条记录亦可,

通俗点说吧,通常来说是这样的:

DataSet和SqlDataAdapter在一起用,就没SqlCommand什么事了,通常作用是把某张表的信息显示出来,比如显示在GridView上之类的

ExecuteNonQuery和SqlCommand一起用,也就没DataSet和SqlDataAdapter什么事了,通常用在对数据的增加、修改、删除,注意查询不能用它

要说查询SqlDataReader和SqlCommand一起使用,是用来查询的,我想你是这个意思,按照我的理解,查询少量数据的时候使用SqlDataReader比较方便和灵活,效率也高,比如查询某一行数据之类的

另外还有个ExecuteScalar也和SqlCommand一起用作用,返回单个值,如求和、总行数等SQL语句的聚合函数,比如SELECT COUNT(*) FROM 表名1

SqlConnection
表示 SQL Server 数据库的一个打开的连接。

System.Data.SqlClient.SqlConnection

SqlConnection 对象表示与 SQL Server 数据源的一个唯一的会话。对于客户端/服务器数据库系统,它相当于到服务器的网络连接。SqlConnection 与 SqlDataAdapter 和 SqlCommand 一起使用,以便在连接 Microsoft SQL Server 数据库时提高性能。对于所有第三方 SQL 服务器产品以及其他支持 OLE DB 的数据源,请使用 OleDbConnection。

SqlDataAdapter
表示用于填充 DataSet 和更新 SQL Server 数据库的一组数据命令和一个数据库连接。

System.Data.SqlClient.SqlDataAdapter

SqlDataAdapter 是 DataSet 和 SQL Server 之间的桥接器,用于检索和保存数据。SqlDataAdapter 通过对数据源使用适当的 Transact-SQL 语句映射 Fill(它可更改 DataSet 中的数据以匹配数据源中的数据)和 Update(它可更改数据源中的数据以匹配 DataSet 中的数据)来提供这一桥接。

SqlDataAdapter 与 SqlConnection 和 SqlCommand 一起使用,以便在连接到 Microsoft SQL Server 数据库时提高性能。若要访问其他数据源,可使用 OleDbDataAdapter 以及与之关联的 OleDbCommand 和 OleDbConnection。

SqlDataAdapter 还包括 SelectCommand、InsertCommand、DeleteCommand、UpdateCommand 和 TableMappings 属性,使数据的加载和更新更加方便。

SqlCommand
表示要对 SQL Server 数据库执行的一个 Transact-SQL 语句或存储过程。

System.Data.SqlClient.SqlCommand

SqlCommand 特别提供了以下对 SQL Server 数据库执行命令的方法:

ExecuteReader 执行返回行的命令。为了提高性能,ExecuteReader 使用 Transact-SQL sp_executesql 系统存储过程调用命令。因此,如果用于执行像 Transact-SQL SET 语句这样的命令,ExecuteReader 可能无法获得预期效果。

ExecuteNonQuery 执行如 Transact-SQL INSERT、DELELE、UPDATE 和 SET 语句等命令。

ExecuteScalar 从数据库中检索单个值(例如一个聚合值)。

ExecuteXmlReader 将 CommandText 发送到 Connection 并生成一个 XmlReader 对象。

.Net 2.0 Themes 功能应用

.Net 在他的2.0版本中增加了Theme功能,一直都没应用过这个功能,偶然在一网站看到了App_Themes夹子,很好奇,百度了下才知道有这个功能~~这个东西的作用就是可以另网站可以有多套皮肤,可以随意的进行切换~

这东西的应用那也是非常的简单,简单到我只需要在项目上单击鼠标右键,选择“添加Asp.Net文件夹”–“主题” 然后自己起个名字,这样主题就建好了,同样的道理,可以多建几个主题文件夹。之后要做的只是在主题文件夹放入css文件,或者skin文件,只要调用”this.theme=主题文件夹的名字”就可以应用主题哈~~~附上测试项目吧

测试项目(Base VS2008):点此下载

.Net Mvc validateRequest设置为false不起作用的解决方案

再跟shp16一起搞CMS,框架计划使用Mvc,昨天调试的时候,总是报“从客户端(content=”<P>This is a test</P…”)中检测到有潜在危险的 Request.Form 值”根据下面的提示,说是将“validateRequest”设置为“false”就好了,可是无论我是在Web.Config里面做全局配置,还是在.aspx文件头部做单一的配置,竟然都不生效~~

直到刚刚,我换了下搜索的关键字,我搜了下“mvc validateRequest”哈哈在Rayshow_hh童鞋的部落格,我找到了答案:

在MVC中如果传递xml等参数时,会报“从客户端中检测到有潜在危险的Request.QueryString值”的错误,无法提交参数,在 web.Config的Pages节点或者aspx页面中添加validateRequest=”false”貌似不起作用。
解决这个问题很简单,只需要在要处理的Action中添加属性[ValidateInput(false)]即可,类似以下:

[ValidateInput(false)]
public ActionResult Index(string org)
{
}

MVC2使用Json返回数据出错

“This request has been blocked because sensitive information could be disclosed to third party web sites when this is used in a GET request. To allow GET requests, set JsonRequestBehavior to AllowGet.”

今天在调试Mvc通过Json传递数据的小例子时,发生了这个错误,网上查阅资料后了解到,出于安全角度考虑,MVC2不允许使用Get方法获取Json数据,仅允许使用Post,而我们非要使用Get怎么办呢?其实错误里已经说明白了,使用return json(json,JsonRequestBehavior.AllowGet) 即可~~

计算机等级考试报名系统(C#+Access)

一周前教务处MC老师给了我一套计算机等级考试报名系统,说是基本的功能有了,但是还有一些功能作者留着没开发。我拿着一看,发现作者已经几乎把该有的东西都实现了,就没做考试成绩查询。据说报名资料修改也不能用,但是我大体看了下代码,代码没问题~~很是灵异。

前一阵一直在忙学院挂牌的事情,这不刚有空余时间,就拿出了几小时把这个程序完善了。先说成绩查询,这套计算机等级考试报名系统用的是Access+C#做的B/S架构的系统,而学院最终提供的成绩是DBF格式的。开始的时候我想把DBF导入到Access里,可是发现这样一是很麻烦,二是Access是桌面型数据库,多人查询效率太低,于是我直接令程序将DBF的数据库传到/Score文件夹下,让程序去连接这个夹子,查询的时候,系统直接读取DBF。

说干就干,对于DBF,我仅在大一的时候学过半学期,而C#结合VFP的应用更是没做过,于是一阵疯狂Google,找到了连接数据源的方法。不过,这里也有些问题:最开始的时候,我使用了“Microsoft.Jet.OLEDB.4.0”去连接DBF,可是程序却总抛出异常说路径无效。奇怪之余再疯狂Google,发现得用“vfpoledb.1”来连接数据库。这样,连接DBF的链接就可以写成: 继续阅读“计算机等级考试报名系统(C#+Access)”

.Net 打开项目出现System.Runtime.InteropServices.COMException错误

刚才使用VS2008打开了之前使用VS2005创建的一个站点项目,可是打不开,总是报”System.Runtime.InteropServices.COMException”错误,从网上查看资料后发现,只需要打开项目文件*.csproj找到其中的<UseIIS>True</UseIIS>将中间的True改成False.故障就解决咯~