今天项目从SqlServer转移到了MySql,转移过程中发现了一些问题,以前没遇到过,在网上查了查,总算是解决了,但是问题的根源还弄明白,暂且记录下来:
首先有个tb_paymentmethod表,表中有几条数据如下:
DAO层获取Model时这样:
if (row["IsDefault"] != null && row["IsDefault"].ToString().Trim()
!= "")
{
model.IsDefault =
Convert.ToBoolean(Convert.ToInt32(row["IsDefault"]));
}
IsDefault为bool型,在插入数据时Mysql默认给的值是 0(false) 和 1(true);
因此导致下面的问题:
///
/// 根据IsDefault获取,默认的、或非默认的实体集合List
///
public static List
GetListByIsDefault(bool Value)
{
StringBuilder safesql = new
StringBuilder();
safesql.Append("select ID,Name,IsDeleted,IsDefault from
tb_paymentmethod");
safesql.Append(" where IsDefault="
+ Value + "order by Name DESC");
return
GetListBySql(safesql.ToString());
}
以往我都是这样写的:=‘" + Value + "‘order
在value两边带了引号,但是用了mysql后由于初始值变为了0/1,当传个bool
value=true,进来时,查询永远得不到想要的结果,去掉引号就可以了,网上给出的说法是:true和false是保留值;
那么问题又来了,我在做删除的时候:
///
/// 根据名字和默认选项删除记录
///
public static bool DeleteByName(string Name)
{
StringBuilder safesql = new
StringBuilder();
safesql.Append("delete from tb_paymentmethod
");
safesql.Append("where Name=@Name and IsDefault=‘"
+ false + "‘");
MySqlParameter[] parameters =
{
new
MySqlParameter("@Name",Name)
};
int rows =
DBUtility.DbHelperMySQL.ExecuteSql(safesql.ToString(), parameters);
if
(rows > 0)
{
return true;
}
else
{
return
false;
}
}
删除的时候,我先是没有在false两边加单引号,结果删除出了问题,但是当我加上引号时,OK没问题。
综上所述:对于Mysql的bit类型处理bool值时,由于true和false是保留值,查询时不加单引号,删除时要加(为什么?)。