问题由来:
在做一个系统,功能是充值查询,在此用的是模糊查询(比如我要查询一个叫小明的同学,我只输入“小”表内就出现所有姓名中有关小的同学)在做的过程中遇到一个问题,都知道模糊查询少不了%的应用。
在此我还写过关于D层访问数据库的初始写法,方法没有错,放到SQL sever里是可以找到的,但是写在VS里需要强转,就遇到了下图的问题。
在让大家看下我数据库表的设计作为参考。注意我每个列明的数据类型~
下面对比下我的两段代码书写格式!
初始可用的模糊查询代码:
//模糊查询 充值表
public class RechargeRecordDAL:IDAL.RechargeRecordIDAL
{
public List<ReChargeInfo> SltStudent(ReChargeInfo ReChargeInfo)
{
SQLHelper sqlHelper = new SQLHelper();
SqlParameter[] sqlParams =
{
new SqlParameter("@CardNo",ReChargeInfo.CardNo),
new SqlParameter("@RechCash",ReChargeInfo.RechCash),
new SqlParameter("@RechDate",ReChargeInfo.RechDate),
new SqlParameter("@UserID",ReChargeInfo.UserID)
};
string sql = @"SELECT * FROM[T_ReCharge]WHERE (CardNo like '%'+@CardNo+'%') and (RechCash like '%'+@RechCash+'%') and (RechDate >=@RechDate) and (UserID like '%'+@UserID+'%')";
DataTable dt = sqlHelper.ExecuteQuery(sql, sqlParams, CommandType.Text);
ConvertSQLHelper convert = new ConvertSQLHelper();
List<ReChargeInfo> list = convert.ConvertToModel<ReChargeInfo>(dt);
return list;
}
}
解决异常处理后的代码
/// <summary>
/// 模糊查询
/// </summary>
/// <param name="recharge"></param>
/// <returns></returns>
public List<ReChargeInfo> CombineInquire(ReChargeInfo recharge)
{
SQLHelper sqlHelper = new SQLHelper();
SqlParameter[] sqlParams =
{
new SqlParameter("@CardNo","%"+ recharge.CardNo +"%"),
new SqlParameter("@RechCash","%"+ recharge.RechCash +"%"),
new SqlParameter("@UserID","%"+ recharge.UserID +"%"),
new SqlParameter("@RechDate",recharge.RechDate)
};
string sql = @"SELECT * FROM[T_Recharge] WHERE (CardNo like @CardNo) and (RechCash like @RechCash)
and (UserID like @UserID) and RechDate = @RechDate";
DataTable dt = sqlHelper.ExecuteQuery(sql, sqlParams, CommandType.Text);
ConvertSQLHelper convert = new ConvertSQLHelper();
List<ReChargeInfo> cdquery = convert.ConvertToModel<ReChargeInfo>(dt);
return cdquery;
}
经过对比细心的人可以看出我把“%”挪了位置,把“%”从SQL语句中转移到了SqlParameter了。因为提示给我的信息是通配符,放到数据库SQL Sever中是可以查出来的,但是在转换中D层的通配符转换不过来,就把通配符拿出来。
此文章仅供参考,希望能给遇到这个问题的人带来帮助。