最近项目心得总结

来公司大半年了吧,年前开始的一个项目算是来公司第一次亲身经历完整项目了,最近该项目已经处于测试阶段了,应该说是基本上完成了吧~

虽然本项目没有太多的技术含量,就是对Excel上的数据进行验证,然后插入到DB中,最后根据某些个条件查个报表,说白了就是个CRUD...但是还是有不少感悟和心得,提炼出一些自己觉得应该注意的地方..

1.既然是对Excel进行操作,那么势必先得从Excel中取得数据。我的做法是先将Excel文档保存到网站的某一个路径,然后由OleDb根据特定的文件名去读取指定Excel的数据(文件名是由当前时间精确到毫秒生成而且没有进行删除,因为像这种需要对数据的文档保存备份也是为了以后可以有据可查),最后返回一个DataTable。在这里值得注意的是,开始时我的sheet名字是写死的,后来发现sheet的名字可以由Excel读取出来,甚至连多个sheet的每个名字都可以取出来。当然,在我们的项目里,填写Excel的人员只会在第一个sheet填写数据,其实是对我的工作进行了简化。哦对了,刚又出现了新情况,在最近的一个读取Excel档页面中,我也用了下LINQ,在得到datatable后我是用LINQ去读的,就像这样:

代码
    public static int GetDistinctCount(DataTable dt)
    {
        
return dt.AsEnumerable()
                    .Select(s 
=> s.Field<string>("ColumnName"))
                    .Distinct()
                    .Count();
    }

 

我其实就是想取ColumnName这一列不重复的值有几个,其实这一列的值都是序列号啦,10位的数字,我这样去读,就会出现cast异常:double类型不能强制转换为string类型,难道我不能把数字当做doule读么...一头雾水的....后来想到Excel格子的数据貌似是有类型设置的,于是把整列的格式设置为文本类型,就没有出现以上异常了。

2.得到了Excel的数据,那么接下来应该对Excel的数据进行验证了。因为Excel的某些字段是与DB中的字段对应的,如果在必填(DB的PK),长度,类型(特别是DateTime)不一致而直接insert的话,毫无疑问会报错。所以验证的话就从以上几个方面,是否必填,长度限制,类型进行验证了。在这里值得注意的是,DB中字段的长度,类型,描述(description)都可以通过SQL语句得到。在本次项目中,我注意到SQL2000与SQL2005在这个SQL语句上是存在区别的~

代码
            string strSql2000 =   @"SELECT a.name [column], b.name type, a.prec length, isnull(c.value, ' '[description]
                                    
FROM syscolumns a
                                    
LEFT JOIN systypes b ON a.xusertype=b.xusertype
                                    
LEFT JOIN sysproperties c ON a.id=c.id AND a.colid=c.smallid 
                                    
WHERE a.id = object_id(@iTable)
                                    
ORDER BY a.colorder";

            string strSql2005 
=   @"SELECT a.name [column], b.name type, a.prec length, isnull(c.value, ' '[description]
                                    
FROM syscolumns a
                                    
LEFT JOIN systypes b ON a.xusertype=b.xusertype
                                    
LEFT JOIN sys.extended_properties c ON a.id=c.major_id AND a.colid=c.minor_id 
                                    
WHERE a.id = object_id(@iTable)
                                    
ORDER BY a.colorder";

 

 得到元数据后就在该datatable中进行行与列的便利,按照特定要求进行判定,如果上传数据存在问题的话就用一条消息指出在某行某列存在什么样的错误,然后程序直接返回。当然,如果数据合格直接插入。

3.在验证数据方面,如果Excel中没有数据的某一行因为用户不小心而输入空格,程序误把空格当成数据,我们得到的datatable是包括这一行的,所以就会在这一行出现很多的错误提示信息。所以我们需判断是否整行均为空字符串,是的话则去掉该行,相当于一个trim(datatable)的作用-去掉空格行,返回一个datatable.

代码
    public static DataTable trim(DataTable dt) 
    {
        List
<DataRow> list = new List<DataRow>();
        
for (int i = 0; i < dt.Rows.Count;i++ )
        {
            
bool flag = false;
            
for (int j = 0; j < dt.Columns.Count;j++ )
            {                
                
if(dt.Rows[i][j].ToString().Trim()!=string.Empty)
                {
                    flag 
= true;
                    
break;
                } 
            }
            
if (!flag)
            {
                list.Add(dt.Rows[i]);
            }

        }
        
foreach(DataRow dr in list)
        {
            dt.Rows.Remove(dr);
        }
        
return dt;
    }

 

另外一个问题就是,这句话看似应该没什么问题吧~

string dateStr = DateTime.Parse(dtData).ToString("yyyy-MM-dd")

 

但是在我们这边却出了问题,因为他们的系统版本是繁体的......我们在自己机器和QT的测试环境中都么出现问题,但是他们却部署到了繁体版本中,一下把这个错报出来了...他们还告诉我们,你们应该用DateTime.Prase啊...囧...其实,把文化信息写死就好了..

                            CultureInfo info = new CultureInfo("EN-US");
                            
string dateStr = DateTime.Parse(dtData).ToString("yyyy-MM-dd",info);   

4.数据的insert是一条一条insert进去的,估计会有点慢....后来看别人写才知道有SqlBulkCopy这个玩意....不过貌似我的这个并不是整表insert(不过可以在datatable中增加列删除列什么的啊),罪过罪过,这次insert效率肯定低了...因为一开始确实不知道有别的什么插入方式,就只好最老实的一条条insert了,对了datatime类型要么插入要么不插入,不能插入一个空字串的datatime类型,所以这次写了好多好多的SQL语句拼接,因为好多datatime字段并非必填...害苦了我!

5.查询方面,其他的东西还好,写个什么SQL语句什么的,拉个控件绑定完事,就是一个根据时间查询把我整垮了.....他们老喜欢玩周别,比如,判断今天是本年第几周啊,随便给你一个日期是当前年份第几周啊,根据某年第几周得出相应的日期间隔啦....就喜欢玩这...我甚至为了弄这用Ajax跑到cs端去调里面的方法了....最后,日历里面还要显示第几周,都郁闷了....

6.部署方面,因为我上传Excel要把Excel存到服务器某个目录下,所以一定要保证有写入的权限。

。。。其他的,想到再说吧..

posted @ 2010-03-15 14:31  Tmac_  阅读(449)  评论(1编辑  收藏  举报