關於SubSonic3.0插件使用SqlQuery或Select查詢時產生的System.NullReferenceException異常修復


  早上在編寫執行用例時,突然爆異常System.NullReferenceException: 未將對象引用設置到對象的實例

  執行代碼:

  

  

未將對象引用設置到對象的實例。

說明: 執行當前 Web 請求期間,出現未經處理的異常。請檢查堆棧跟蹤信息,以了解有關該錯誤以及代碼中導致錯誤的出處的詳細信息。

異常詳細信息: System.NullReferenceException: 未將對象引用設置到對象的實例。

源錯誤:

行 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時創建泛型對應的表實體,修改如下:

  

  

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;
        }
View Code

 

  

  添加完以上代碼后,將SubSonic3.0插件源碼重新生成一下就可以正常使用了。

 

 版權聲明:

  本文由AllEmpty原創並發布於博客園,歡迎轉載,未經本人同意必須保留此段聲明(否則保留追究責任的權利),且在文章頁面明顯位置給出原文鏈接,如有問題,可以通過1654937@qq.com 聯系我,非常感謝。

  發表本編內容,只要主為了和大家共同學習共同進步,有興趣的朋友可以加加Q群:327360708 或Email給我(1654937@qq.com),大家一起探討。

  更多內容,敬請觀注博客:http://www.cnblogs.com/EmptyFS/

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM