只要是人就會犯錯誤,只要是軟件就會有BUG,即使他是nhibernate
nhibernate1.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;
}