力软框架之我见——SQL三层MVC架构(问题之不存在对象类型System.Data.Common.DbParameter)

今天我使用Database中的FindEntityByWhere,写入参数数出现了错误,如下图:

我写的程序是这样的。

       public  Base_User GetByNameAndPWD(string Account, string Password)
        {
            string Sqlstr = "Select * from Base_User Where Account=@Account and Password = @Password";
         List<DbParameter> parameter = new List<DbParameter>();
         parameter.Add(DbFactory.CreateDbParameter("@Account", Account);
         parameter.Add(DbFactory.CreateDbParameter("@Password", Password));
   return  Repository().FindEntityByWhere(Sqlstr, parameter.ToArray());
        }

提示是提示参数出错了!

首先跟踪到函数

/// <summary>
        /// 查询对象、返回实体
        /// </summary>
        /// <param name="WhereSql">条件</param>
        /// <param name="parameters">sql语句对应参数</param>
        /// <returns></returns>
        public T FindEntityByWhere(string WhereSql, DbParameter[] parameters)
        {
            return DataFactory.Database().FindEntity<T>(WhereSql, parameters);
        }

继续:对应到这里

  /// <summary>
        /// 查询对象、返回实体
        /// </summary>
        /// <param name="propertyName">实体属性名称</param>
        /// <param name="propertyValue">字段值</param>
        /// <returns></returns>
        public T FindEntity<T>(string propertyName, object propertyValue) where T : new()
        {
//获取数据库查询名字
string pkName = propertyName;
//DatabaseCommon的函数是这样的
        StringBuilder strSql = DatabaseCommon.SelectSql<T>(1);
        /// <summary>
        /// 拼接 查询 SQL语句
        /// </summary>
        /// <param name="Top">显示条数</param>
        /// <returns></returns>
        public static StringBuilder SelectSql<T>(int Top) where T : new()
        {
//映射的知识 http://blog.csdn.net/educast/article/details/2894892

1,获取表名
string tableName = typeof(T).Name;
2,获取属性名如有这样的属性Id ,Name PropertyInfo[] props
= GetProperties(new T().GetType()); StringBuilder sbColumns = new StringBuilder(); foreach (PropertyInfo prop in props) { sbColumns.Append(prop.Name + ","); }
3,拼接字符串结果为 Select top 1 Id,Name from User(表名) where 1=1
if (sbColumns.Length > 0) sbColumns.Remove(sbColumns.ToString().Length - 1, 1); string strSql = "SELECT top {0} {1} FROM {2} WHERE 1=1 "; strSql = string.Format(strSql, Top, sbColumns.ToString(), tableName + " "); return new StringBuilder(strSql); }
            4.上面的结果为:select top 1 id,name from User Where 1=1
            strSql.Append(" AND ").Append(pkName).Append("=").Append(DbHelper.DbParmChar + pkName);
5,继续拼接 select top 1 id,name from User Where 1=1 and Id=@id(假设输入的值为Id)DbHelper.DbParmChar的值为@ IList
<DbParameter> parameter = new List<DbParameter>(); parameter.Add(DbFactory.CreateDbParameter(DbHelper.DbParmChar + pkName, propertyValue));
6,添加SQL参数,执行 IDataReader dr
= DbHelper.ExecuteReader(CommandType.Text, strSql.ToString(), parameter.ToArray()); return DatabaseReader.ReaderToModel<T>(dr); }

 那么我知道哪里错了,

FindEntityByWhere是通过某个具体的条件查询
要这样写

   public  Base_User GetByNameAndPWD(string Account, string Password)
   {
           
         List<DbParameter> parameter = new List<DbParameter>();    
parameter.Add(DbFactory.CreateDbParameter("@Password", Password));
return Repository().FindEntityByWhere("Password", parameter.ToArray());
   }
答案解决,问题排查!
posted @ 2016-09-17 22:28  Restrain  阅读(1818)  评论(0)    收藏  举报