早上在编写执行用例时,忽然爆异常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