添加自定义标签后C#程序SqlConnection抛出无连接字符串异常排查
为啥加了自定义
<tag>到app.config,硬编码的SqlConnection反而报错了? 哈哈,这个问题初看真的有点反直觉——你明明是硬写死连接字符串实例化SqlConnection的,按说和app.config的内容八竿子打不着啊?其实问题的根源不在SqlConnection本身,而是.NET的配置文件解析机制在搞事情:
核心原因:自定义配置节没注册,导致配置加载炸了
.NET的配置系统有个死规矩:所有非内置的自定义配置节点(比如你加的<tag>),必须提前在<configSections>里注册对应的处理程序,不然ConfigurationManager加载配置文件的时候直接就抛异常了。
那为啥会影响到硬编码的SqlConnection呢?大概率是你的程序在创建SqlConnection之前,有读取配置的操作——比如你加了appSettings之后,肯定会在代码里读template或者saveas的值吧?当你调用ConfigurationManager.AppSettings["template"]的时候,就会触发配置文件的加载流程,这时候因为<tag>没注册,配置解析直接失败,抛出的异常会打断后续代码执行,最后表现出来的就是“SqlConnection没有连接字符串”的次生错误,其实真正的锅是配置加载失败。
解决办法分两种情况
- 如果不需要这个
<tag>节点:直接把它从app.config里删掉就行,配置系统就能正常工作,你的硬编码连接字符串代码也会立刻恢复正常。 - 如果必须保留
<tag>节点:那得在配置文件最顶部加个<configSections>注册它,要是你不需要读取这个标签的内容,用忽略处理程序就行:
要是之后需要读取<?xml version="1.0" encoding="utf-8" ?> <configuration> <!-- 先注册自定义配置节,必须放在configuration的最开头! --> <configSections> <section name="tag" type="System.Configuration.IgnoreSectionHandler" /> </configSections> <appSettings> <add key="template" value="value"/> <add key="saveas" value="value"/> </appSettings> <tag> </tag> </configuration><tag>里的内容,那得自己写个继承ConfigurationSection的类,把type改成这个类的完整命名空间+类名就行。
快速验证方法
你可以先把<tag>删掉跑一遍程序,如果正常了,那完全符合上面的分析。要是确实要留这个标签,再按上面的方法加配置节注册就好。
内容的提问来源于stack exchange,提问作者elle0087
相关产品推荐
相关产品推荐

