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


        在调试程序时,同事发现添加记录时,出现了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属性(请看下图),然后运行代码,没有报错,打开数据库发现表里已经成功添加了一条记录。

     

      本文章为原创内容,转载请保留下面信息。

      发表本编内容,只要主为了和大家共同学习共同进步,有兴趣的朋友可以加加Q群:SubSonic3.0学习群(327360708)或Email给我(1654937#qq.com),大家一起探讨,由于本人工作很繁忙,如果疑问请先留言,回复不及时也请谅解。

      想了解更多SubSonic3.0的相关问题,请观注博客:http://www.cnblogs.com/EmptyFS/

  • 相关阅读:
    在 windows 系统中使用 redis
    excel公式固定与同一个单元格进行计算
    Emmet快速生成HTML代码的常用语法总结
    手写js中的bind
    JS实现瀑布流页面布局
    010drawio使用流程图,树形图和思维导图的自动布局形状
    Fluentd 使用 multiline 解析器来处理多行日志
    tar 命令压缩时报错 tar: Removing leading `/' from member names
    将 Docker Engine 节点从 dockershim 迁移到 cridockerd
    在 Kubernetes 集群中使用 NodeLocal DNSCache
  • 原文地址:https://www.cnblogs.com/EmptyFS/p/3202509.html
Copyright © 2020-2023  润新知