zoukankan      html  css  js  c++  java
  • NSS_05 数据访问选型

      在数据访问层上很想用orm框架, 选用Nhibernate或ef, 可以直接操作类对象, 避免转换, 更加的面向对象,更重要的是开发起来就方便多了。 但是从网上了解到这些框架太高级了, 用得不好到时会有性能问题, 针对这个方面, 还是等以后熟悉了再用吧。 剩下linq也不熟,时间不允许了, 所以选用Entlib5.0, 总比ado.net要方便一些的吧。

      其实使我坚定下来使用entlib主要是看到一个功能: "Retrieving data as a sequence of objects."的ExecuteSprocAccessor和ExecuteSqlStringAccessor这样直接返回对象类型的查询结果, 岂不是很棒, 大概看了一下使用方法,也不是很复杂。最后发现不认真害死人啊。 

      在实际使用中才发现这俩方法, 每个方法都需要内建一个类来实现IParameterMapper和IRowMapper来传递参数和结果集与对象字段的映射。 超级麻烦(也许我还不知道更简便的用法), 这样用会使人疯掉。想来想去, 反正结果集到类对象都需要一个转换过程,还不如自己写转换好了。

      然后问题又来了, 是返回DataTable然后解析呢, 还是直接返回DataReader, 查了一下谷歌。看到下面参考的第二个网站,作者分别通过executeDataSet, IDataReader, ExecuteSqlStringAccessor三种方式访问数据库并转化为对象, 结果为:

    Mapped: 50000 Records in 1115894 Ticks via DataSet 
    Mapped: 50000 Records in 563554 Ticks via ExecuteSqlStringAccessor 
    Mapped: 50000 Records in 562318 Ticks via IDataReader/IDataRecord

    看起来通过IDataReader的性能最高, 作者选用ExecuteSqlStringAccessor也是看中它能方便地转化为对象。但由于上面原因, 我只能选用IDataReader.在使用中发现几个问题。

    • 检索到空值

      一般返回结果可以用类似reader.getString(0)或reader[0]的形式来获取数据, 但是如果这一项为空的话, 就会报异常。得首先用reader.IsDbNull来判断是否为空, 网上查到reader.getValue()在空值是不会异常,返回空字符地中,不过没有测试。 我用的是另一种方法,如下面代码示例

    using (DbCommand cmd = db.GetSqlStringCommand(this.getPaginationSql(sql.ToString())))
                {
                    db.AddInParameter(cmd, "startRow", DbType.UInt32, start);
                    db.AddInParameter(cmd, "endRow", DbType.UInt32, start + limit);
                    List<User> user = new List<User>();
                    using (IDataReader reader = db.ExecuteReader(cmd))
                    {
                        while (reader.Read())
                        {
                            user.Add(new User {
                                User_id = reader["user_id"] as string,
                                User_name = reader["user_name"] as string,
                                User_pwd = reader["user_pwd"] as string,
                                Description = reader["description"] as string,
                                Phone = reader["phone"] as string,
                                Email = reader["email"] as string,
                                InvalidTime = reader["invalidtime"] as DateTime?,
                                CreateTime = reader["createtime"] as DateTime?,
                                Last_login_time = reader["last_login_time"] as DateTime?
                            });
                        }
                    }
                }

    在加入List时, 有时会将已经排序好的对象顺序打乱, 这就需要在前前store中配置排序, 对总的功能不影响.反正用extjs,前台就多做一点事了。

    --------------------------------------------------------------------------------------------------------------------------------------------

    在后面测试时发现,如果store中加入sorter, 则在grid分页后, 每次加载数据后, 行号插件都会重新从1开始计算, 又没找到原因,只能暂时取消前台这个排序啦, 有高手赐教一下子不?

    「参考」

    1. http://msdn.microsoft.com/en-us/library/ff953187(v=pandp.50).aspx
    2. http://markcoleman.tumblr.com/post/2628469993/three-different-ways-to-access-data-via-enterprise
  • 相关阅读:
    Java内存模型
    Redis的复制特性
    Redis数据持久化
    Java的三种代理模式
    设计模式—模板方法模式
    设计模式—观察者模式
    web性能优化之:no-cache与must-revalidate深入探究
    JWT
    数值每三位加逗号
    Webpack 打包优化之速度篇
  • 原文地址:https://www.cnblogs.com/taotaonwsuaf/p/3220252.html
Copyright © 2011-2022 走看看