力软框架之我见——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());
}
答案解决,问题排查!

浙公网安备 33010602011771号