关于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时创建泛型对应的表实体,修改如下:

  

  

关于SubSonic3.0插件使用SqlQuery或Select查询时产生的System.NullReferenceException异常修复
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原创并发布于博客园,欢迎转载,未经本人同意必须保留此段声明(否则保留追究责任的权利),且在文章页面明显位置给出原文链接,如有问题,可以通过[email protected] 联系我,非常感谢。

  发表本编内容,只要主为了和大家共同学习共同进步,有兴趣的朋友可以加加Q群:327360708 或Email给我([email protected]),大家一起探讨。

  更多内容,敬请观注博客:http://www.cnblogs.com/EmptyFS/

 

 

你可能感兴趣的:(exception)