首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

NHibernate Access 方言 Bug 追踪:FinalizeJoins 方法解析 JOIN 子句錯誤

     編輯:關於ASP.NET

問題現場

專案從 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。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved