1.项目开始前先确定数据表结构,逻辑关系一定要理顺。
2.根据需求自定义数据类,以及自定义exception类,在自定义类中对各种例外进行处理
3.中间层很好用,比如nhibernate这种架构,虽然还没用过。
4.在用户登录系统的时候提取用户权限等基本信息在cookies中,最好是加过密的。当然判断登录状态还得用session。
5.用户系统中,菜单栏由于权限不同导致显示不同,必须将其做成控件,便于修改和维护。
6.最好引入日志系统如log4net,便于测试以及后期维护。
ps:上面几点很多都是从java中取得的经验,引入到asp.net项目中。等时间充裕的时候好好研究C#桌面程序,感觉应该不难。哈哈,由于java桌面程序太烂实在是没兴趣做,这次终于可以施展一下了,顺便比较下java 和C#的区别
微博客受到越来多人的认可,其实是从QQ签名中单独剥离出来的的一种互联网应用形式。微博客的好处在于实时性和随意性。从07年开始用饭否,到现在快两年了。关于饭否,想说几点
1.饭否可以针对好友进行回复,但是无法体现主题-跟贴这样的关系。往往看到很多好友在@别人的留言,但经常不知道他们在聊什么。当两个人在用饭否进行对话,其中一个人不是我好友的时候,我无法知道这个人在说什么。当我的好友在一个较短的时间发了多条饭否留言,而我对他的任何一条留言进行回复,他都不知道这条回复是针对哪条留言的,这样往往就会造成误解。解决这个问题的有效方法是设置饭否留言两种显示形式,一种是根据留言时间排列,一种根据留言回复关系排列。
2.饭否可以添加好友,但是当好友数量太多,而且其中很多好友是话痨的时候,你会发现你无法顺利查看好友留言。因为留言数量实在是太多了,想找到某一个人的最新留言可能要翻好几页才能找到。而另一些人的留言,铺天盖地的显示在你的饭否上。解决这个问题的方法是后台设置单个好友一天最多显示的留言条数,前台针对好友有一个选项,显示全部留言 or 显示最新留言。
3.饭否可以收藏别人的留言,但是这个功能确实相当的鸡肋。因为收藏的留言没有任何动态信息。一个比较不错的方法是将收藏改为分享,当分享某人的留言时,这条留言就会被其他好友看到。或者改为“顶”和“踩”,当你“顶”了某好友的留言后,饭否上会显示相关信息。在这个基础上可以做一个饭否排行榜,统计一天中被分享次数最多的留言(或者是被顶次数最多,被踩次数最多)。
饭否应该是一个web2.0时代的产物,但他现在确实做得不够web2.0. 希望饭否的开发者们如果看到了我这篇日志,多多采纳我的建议。如果做得好的话,饭否应该能超越twitter,至少占领中国市场应该是没问题的。
效果:
using System;
using System.Collections;
using System.Collections.Specialized;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace LiTianPing.SQLServerDAL //可以修改成实际项目的命名空间名称
{
/// <summary>
/// Copyright (C) 2004-2008 LiTianPing
/// 数据访问基础类(基于SQLServer)
/// 用户可以修改满足自己项目的需要。
/// </summary>
public abstract class DbHelperSQL
{
//数据库连接字符串(web.config来配置)
//<add key="ConnectionString" value="server=127.0.0.1;database=DATABASE;uid=sa;pwd=" />
protected static string connectionString = ConfigurationSettings.AppSettings["ConnectionString"];
public DbHelperSQL()
{
}
#region 执行简单SQL语句
/// <summary>
/// 执行SQL语句,返回影响的记录数
/// </summary>
/// <param name="SQLString">SQL语句</param>
/// <returns>影响的记录数</returns>
public static int ExecuteSql(string SQLString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand cmd = new SqlCommand(SQLString, connection))
{
try
{
connection.Open();
int rows = cmd.ExecuteNonQuery();
return rows;
}
catch (System.Data.SqlClient.SqlException E)
{
connection.Close();
throw new Exception(E.Message);
}
}
}
}
/// <summary>
/// 执行多条SQL语句,实现数据库事务。
/// </summary>
/// <param name="SQLStringList">多条SQL语句</param>
public static void ExecuteSqlTran(ArrayList SQLStringList)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
SqlTransaction tx = conn.BeginTransaction();
cmd.Transaction = tx;
try
{
for (int n = 0; n < SQLStringList.Count; n++)
{
string strsql = SQLStringList[n].ToString();
if (strsql.Trim().Length > 1)
{
cmd.CommandText = strsql;
cmd.ExecuteNonQuery();
}
}
tx.Commit();
}
catch (System.Data.SqlClient.SqlException E)
{
tx.Rollback();
throw new Exception(E.Message);
}
}
}
/// <summary>
/// 执行带一个存储过程参数的的SQL语句。
/// </summary>
/// <param name="SQLString">SQL语句</param>
/// <param name="content">参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式添加</param>
/// <returns>影响的记录数</returns>
public static int ExecuteSql(string SQLString, string content)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand(SQLString, connection);
System.Data.SqlClient.SqlParameter myParameter = new System.Data.SqlClient.SqlParameter("@content", SqlDbType.NText);
myParameter.Value = content;
cmd.Parameters.Add(myParameter);
try
{
connection.Open();
int rows = cmd.ExecuteNonQuery();
return rows;
}
catch (System.Data.SqlClient.SqlException E)
{
throw new Exception(E.Message);
}
finally
{
cmd.Dispose();
connection.Close();
}
}
}
/// <summary>
/// 向数据库里插入图像格式的字段(和上面情况类似的另一种实例)
/// </summary>
/// <param name="strSQL">SQL语句</param>
/// <param name="fs">图像字节,数据库的字段类型为image的情况</param>
/// <returns>影响的记录数</returns>
public static int ExecuteSqlInsertImg(string strSQL, byte[] fs)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand(strSQL, connection);
System.Data.SqlClient.SqlParameter myParameter = new System.Data.SqlClient.SqlParameter("@fs", SqlDbType.Image);
myParameter.Value = fs;
cmd.Parameters.Add(myParameter);
try
{
connection.Open();
int rows = cmd.ExecuteNonQuery();
return rows;
}
catch (System.Data.SqlClient.SqlException E)
{
throw new Exception(E.Message);
}
finally
{
cmd.Dispose();
connection.Close();
}
}
}
/// <summary>
/// 执行一条计算查询结果语句,返回查询结果(object)。
/// </summary>
/// <param name="SQLString">计算查询结果语句</param>
/// <returns>查询结果(object)</returns>
public static object GetSingle(string SQLString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand cmd = new SqlCommand(SQLString, connection))
{
try
{
connection.Open();
object obj = cmd.ExecuteScalar();
if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
{
return null;
}
else
{
return obj;
}
}
catch (System.Data.SqlClient.SqlException e)
{
connection.Close();
throw new Exception(e.Message);
}
}
}
}
/// <summary>
/// 执行查询语句,返回SqlDataReader
/// </summary>
/// <param name="strSQL">查询语句</param>
/// <returns>SqlDataReader</returns>
public static SqlDataReader ExecuteReader(string strSQL)
{
SqlConnection connection = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand(strSQL, connection);
try
{
connection.Open();
SqlDataReader myReader = cmd.ExecuteReader();
return myReader;
}
catch (System.Data.SqlClient.SqlException e)
{
throw new Exception(e.Message);
}
}
/// <summary>
/// 执行查询语句,返回DataSet
/// </summary>
/// <param name="SQLString">查询语句</param>
/// <returns>DataSet</returns>
public static DataSet Query(string SQLString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
DataSet ds = new DataSet();
try
{
connection.Open();
SqlDataAdapter command = new SqlDataAdapter(SQLString, connection);
command.Fill(ds, "ds");
}
catch (System.Data.SqlClient.SqlException ex)
{
throw new Exception(ex.Message);
}
return ds;
}
}
#endregion
}
}