我的CMS开发记-32011-12-18 博客园 烙馅饼喽只要是人就会犯错误,只要是软件就会有BUG,即使他是nhibernatenhibernate1.2支持access数据库。但是我一直在用sqlserver开发。现在已经有了一点样子,于是我心血来潮,将数据库切换为Access,看看执行的效果如何。碰,出错了。Sql语句语法错误。我靠,果然有错误,改改,再试?还是出错。郁闷了。打断点开始调试,确定我的代码没有错。我没错那谁错了?nhibernate??不会吧? 不过事已至此,又不可能重新写,只好硬着头皮上了,呵呵。将nhibernate的引用移除,直接引用nhibernate的源码开始调试,没想到啊没想到,居然还真的被我给找出bug 来了。nhibernate处理access时,使用的是jetdriver这个方言。由于access的特殊性(sql语句做连接时,必须要用括号),于是在jetdriver里,对sql语句进行了处理。代码 在此:jetdriver.cs的96行处有这么一段
private SqlString FinalizeJoins(SqlString sqlString)
{
if (_queryCache.Contains(sqlString))
{
return (SqlString) _queryCache[sqlString];
}
// fix wxy
int beginOfFrom = sqlString.IndexOfCaseInsensitive(" from ");
int endOfFrom = sqlString.IndexOfCaseInsensitive(" where ");
if (beginOfFrom < 0)
{
return sqlString;
}
if (endOfFrom < 0)
{
endOfFrom = sqlString.Length;
}
string fromClause = sqlString.Substring(beginOfFrom, endOfFrom - beginOfFrom).ToString();
string transformedFrom = TransformFromClause(fromClause);
//put it all together again
SqlStringBuilder final = new SqlStringBuilder(sqlString.Count + 1);
final.Add(sqlString.Substring(0, beginOfFrom));
final.Add(transformedFrom);
final.Add(sqlString.Substring(endOfFrom));
SqlString ret = final.ToSqlString();
_queryCache[sqlString] = ret;
return ret;
}