專案從 SQL Server 遷移至 Access,NHibernate 拋出 SQL 語法錯誤。程式碼邏輯無誤,懷疑 NHibernate 本身缺陷。
移除 NHibernate 參考,直接引用原始碼專案除錯,發現 JetDriver.cs 第 96 行 FinalizeJoins 方法處理 FROM/WHERE 子句邏輯有誤:
private SqlString FinalizeJoins(SqlString sqlString)
{
if (_queryCache.Contains(sqlString))
return (SqlString)_queryCache[sqlString];
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);
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;
}
Access 要求 JOIN 子句加括號,但此處解析邏輯未正確處理巢狀 JOIN,導致產生無效 SQL。