早上在編寫執行用例時,忽然爆異常System.NullReferenceException: 未將對象引用設置到對象的實例express
執行代碼:併發
說明: 執行當前 Web 請求期間,出現未經處理的異常。請檢查堆棧跟蹤信息,以瞭解有關該錯誤以及代碼中致使錯誤的出處的詳細信息。
異常詳細信息: System.NullReferenceException: 未將對象引用設置到對象的實例。
源錯誤:
ide
行 168: foreach(Constraint constrain in c)
行 169: {
行 170: IColumn column = _provider.FindTable(typeof(T).Name).GetColumnByPropertyName(constrain.ColumnName);
行 171: constrain.ColumnName = column.Name;
行 172: constrain.ConstructionFragment = column.Name; |
源文件: E:\Asp.net\******\SubSonic.Core\Query\SqlQuery.cs 行: 170
堆棧跟蹤:
函數
[NullReferenceException: 未將對象引用設置到對象的實例。] SubSonic.Query.SqlQuery.Where(Expression`1 expression) in E:\Asp.net\******\SubSonic.Core\Query\SqlQuery.cs:170 SubSonicTest.Test.Page_Load(Object sender, EventArgs e) in E:\Asp.net\******\SubSonicTest\Test.aspx.cs:19 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +51 System.Web.UI.Control.OnLoad(EventArgs e) +92 System.Web.UI.Control.LoadRecursive() +54 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +772 |
經過Debug追蹤後,發現SqlQuery類的條件添加函數中,在執行經過反射獲取泛型類後,查找條件列名併爲條件列賦值時,因爲沒有找到該列而產生的異常學習
對此進行相應修改,添加判斷,爲null時建立泛型對應的表實體,修改以下:this
public SqlQuery Where<T>(Expression<Func<T, bool>> expression) where T : new() { //ExpressionParser parser = new ExpressionParser(); IList<Constraint> c = expression.ParseConstraints(); /* * 修 改 人:Empty(AllEmpty) * QQ 羣:327360708 * 博客地址:http://www.cnblogs.com/EmptyFS/ * 修改時間:2014-04-16 * 修改說明:在使用SqlQuery或Select查詢時,因爲_provider(即DbDataProvider)的Schema.Tables爲null,執行FindTable時直接返回null值, * 獲取IColumn也是null值,因此使用獲取的IColumn對相關變量進行賦值時就會產生System.NullReferenceException異常 * 異常信息:System.NullReferenceException: 未將對象引用設置到對象的實例。 *********************************************/ //獲取當前泛型對應的Table var iTable = _provider.FindTable(typeof (T).Name); //若是爲null,則建立它 if (iTable == null) { iTable = _provider.FindOrCreateTable<T>(); } foreach(Constraint constrain in c) { //IColumn column = _provider.FindTable(typeof (T).Name).GetColumnByPropertyName(constrain.ColumnName); //原版本代碼 IColumn column = iTable.GetColumnByPropertyName(constrain.ColumnName); constrain.ColumnName = column.Name; constrain.ConstructionFragment = column.Name; constrain.DbType = column.DataType; constrain.ParameterName = column.ParameterName; constrain.QualifiedColumnName = column.QualifiedName; constrain.TableName = column.Table.Name; Constraints.Add(constrain); } return this; }
添加完以上代碼後,將SubSonic3.0插件源碼從新生成一下就能夠正常使用了。spa
版權聲明:
本文由AllEmpty原創併發佈於博客園,歡迎轉載,未經本人贊成必須保留此段聲明(不然保留追究責任的權利),且在文章頁面明顯位置給出原文連接,若有問題,能夠經過1654937@qq.com 聯繫我,很是感謝。.net
發表本編內容,只要主爲了和你們共同窗習共同進步,有興趣的朋友能夠加加Q羣:327360708 或Email給我(1654937@qq.com),你們一塊兒探討。插件
更多內容,敬請觀注博客:http://www.cnblogs.com/EmptyFS/3d