关于SubSonic3.0查询或更新时出现System.NullReferenceException异常的处理_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 关于SubSonic3.0查询或更新时出现System.NullReferenceException异常的处理

关于SubSonic3.0查询或更新时出现System.NullReferenceException异常的处理

 2013/7/20 16:57:10  AllEmpty  博客园  我要评论(0)
  • 摘要:在调试程序时,同事发现添加记录时,出现了System.NullReferenceException异常DictBasedict=newDictBase();dict.DictCode="aaa";dict.DictName="bbb";dict.Save();而自己在编写查询Informationinfo=newInformation(x=>x.Id==1);时,也引发了同样的异常,经Debug发现,问题出现在SubSonic.Schema
  • 标签:system 异常

    在调试程序时,同事发现添加记录时,出现了System.NullReferenceException异常

    DictBase dict = new DictBase();
    dict.DictCode = "aaa";
    dict.DictName = "bbb";
    dict.Save();

 

    而自己在编写查询Information info = new Information(x => x.Id == 1);  时,也引发了同样的异常,经Debug发现,问题出现在SubSonic.Schema.DatabaseTable类的函数

        public IColumn GetColumnByPropertyName(string PropertyName)
        {
            return Columns.SingleOrDefault(x => x.PropertyName.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
        }

 

    发现PropertyName属性为null而引起的空指针异常,心想是不是因为没有捕捉到异常而引起的,就将函数修改为下面代码:

        public IColumn GetColumnByPropertyName(string PropertyName)
        {
            try
            {
                return Columns.SingleOrDefault(x => x.PropertyName.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
            }
            catch (Exception) { }
            return null;
        }

 

    改完后发现这个位置没问题了,但却引发了另外一个异常(Need to specify Values or a Select query to insert - can't go on!),意思是说插入的语句没有具体的值,然后通过Debug追踪,原来是加了异常捕捉后,返回的内容都为null了,没有运行到SQL执行语句值的添加操作,即SubSonic.Extensions.Database类的ToInsertQuery函数在执行前面函数返回值时为null时,query.Value(col.QualifiedName, hashed[key], col.DataType);这段语句没有执行到导致出错,就是说PropertyName一直都没有赋到值引起的null异常并没有找到根源,所以又从头开始Debug,一步步跟踪到Structs1.cs这个由模版生成的类里,发现在生成数据库表对应的架构一直到最后使用,并没有对PropertyName属性进行赋值。所以打开Structs.tt这个模版文件,将数据字段结构生成那里做了下面的修改,添加了PropertyName属性(请看下图),然后运行代码,没有报错,打开数据库发现表里已经成功添加了一条记录。

 

发表评论
用户名: 匿名