这个项目我在分析设计的时候采用了3层构架。我的基本思想是只要和数据库交互的字段和控件,我都把它当作参数传给中间层,然后中间层调用数据层的runCommand()方法,从而达到了各层分工明细的目的。在验证表单方面,我使用了JS,在客户端验证,可以减低服务器压力。
下面是一段注册用户的代码:
 
//register.cs
//通过一个提交事件,将控件值传入业务层
private void Submit_ServerClick(object sender, System.EventArgs e)
{
         UserInfo user=new UserInfo();                    
         user.AddUser(this.UserName.Value,this.PasswordR.Value,this.Email.Value,this.Homepage.Value,
                                     this.show_face.Src);
}
//UserInfo.cs                                 
public void AddUser(string username,string passwords,string email,
         string homepage,string face)
{
         Database data = new Database();
         OleDbParameter[] prams={                        
                                                        data.MakeInParam("@username",OleDbType.VarChar,16),
                                                        data.MakeInParam("@passwords",OleDbType.VarChar,12),
                                                         data.MakeInParam("@email",OleDbType.VarChar,50),
                                                       data.MakeInParam("@homepage",OleDbType.VarChar,50),
                                                       data.MakeInParam("@face",OleDbType.VarChar,50)
                                                    };
    //SQL语句                         
         strcmd="insert into Users(username,passwords,email,homepage,face) values (@username, @passwords, @email, @homepage, @face)";
         //将传入的参数放进数组里           
         string[] values={username,passwords, email, homepage, face};
    //将数据库相对应每个字段的变量放进数组
         string[] datacolumn={"@username","@passwords", "@email", "@homepage", "@face"};
    //调用数据层的runCommand()方法
         data.runCommand(strcmd,prams,datacolumn,values);       
}
//Database.cs
//返回一个OleDbParameter对象
public OleDbParameter MakeInParam(string ParamName, OleDbType DbType,int size) 
{
         OleDbParameter param;
         return param=new OleDbParameter(ParamName,DbType,size);
}
 
public void runCommand(string strcmd,OleDbParameter[] prams,string[] datacolumn,string[] values)
{
         OleDbDataAdapter cmd = new OleDbDataAdapter(strcmd, conn);     
    this.Open();
         if (prams != null) 
         {
        //2个循环主要是为了创建
        // cmd.SelectCommand.Parameters.Add(new OleDbParameter ("@username",OleDbType.VarChar,16));
//赋值
// cmd.SelectCommand.Parameters[@username].Value=username;
//我这样设计主要是为了考虑如果以后要添加或删除用户信息的话,
//我只要修改业务层
                   foreach (OleDbParameter parameter in prams)
                   {
                            cmd.SelectCommand.Parameters.Add(parameter);                                        
                   }
                   for(int i=0;i<values.Length;i++)
                   {
                            cmd.SelectCommand.Parameters[datacolumn[i]].Value=values[i];
                   }
         }                 
         cmd.SelectCommand.ExecuteNonQuery();
         this.Close();                        
}
      完成项目后,我发现了很多问题,试着想去改,怕破坏原来的结构,总的来说还是失败了,我总结了以下经验和问题:
1.在多表操作的时候应该使用存储过程,因为句子一长很容易错,而且调试后才能知道结果,如果是存储过程的话可以在MSSQL中验证语句是否错误。当然存储过程还有其他优点。
2.用JS脚本验证表单。我觉得比.NET提供的验证控件方便多了,而且本地验证减少网络传输中这样那样的问题。
3.我有次在别人机子上调试的出了问题:老是报:“该操作不是一个可更新的操作。”我郁闷了好久,最后在别人帖子了找到了答案,原来是WINDOWS权限问题,那机子用的是WINDOWS2003。
4.我觉得象我这样普通的毕业生,软件工程对我来说太渺茫了,根本就没法达到自己预期的理想,就算是分析时设计到的功能,但在代码实现时被自己设计的框架而卡住。所以我就有个疑问:是拿别人的设计书写好,还是自己设计自己写好?虽然我时常偷窥某人设计书,但是终不得精髓。(就像有了内功新法确缺少套路一样)
5.戒骄戒躁。我觉得骄傲烦躁这是编程大忌。林锐博士一本书写到他同学编程的时候,说他编程的时候简直不是人,就是个指针。可能这就是高手和普通人的区别把