程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> 我的CMS開發記-3

我的CMS開發記-3

編輯:關於ASP.NET

只要是人就會犯錯誤,只要是軟件就會有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;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved