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
posted @ 2013-07-27 21:12  taotaonwsuaf  阅读(336)  评论(0编辑  收藏  举报