读取多个.config文件中connectionStrings遇空引用,求替代弃用API方案
解决读取多个自定义.config文件中connectionStrings的问题
默认情况下,ConfigurationManager只会自动加载程序的主配置文件(如app.config或web.config),你自定义命名的file1.ddl.config、file2.ddl.config不会被自动加载,这就是你调用ConfigurationManager.ConnectionStrings["NAME"]时出现空引用错误的原因。以下是两种可行的解决方法:
方法一:使用ConfigurationManager加载指定配置文件
需要先引用System.Configuration程序集,然后通过手动映射配置文件的方式加载目标文件,再读取其中的连接字符串:
using System.Configuration; // 配置文件路径,替换为你的实际路径 string configPath = @"C:\YourProject\file1.ddl.config"; // 创建配置文件映射 var configMap = new ExeConfigurationFileMap { ExeConfigFilename = configPath }; // 加载指定配置文件 Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None); // 读取指定名称的连接字符串 ConnectionStringSettings connSetting = config.ConnectionStrings.ConnectionStrings["YourConnectionName"]; if (connSetting != null) { string targetConnString = connSetting.ConnectionString; // 这里添加你的业务逻辑处理 }
如果是Web项目,将OpenMappedExeConfiguration替换为WebConfigurationManager.OpenMappedWebConfiguration即可,逻辑一致。
方法二:直接解析XML文件(轻量方案)
因为.config本质是标准XML文件,你可以直接用XML解析类读取,无需依赖System.Configuration的复杂配置体系,适合简单场景:
使用XmlDocument的示例:
using System.Xml; XmlDocument configDoc = new XmlDocument(); configDoc.Load(@"C:\YourProject\file2.ddl.config"); // 定位到connectionStrings下的所有add节点 XmlNodeList connNodes = configDoc.SelectNodes("/configuration/connectionStrings/add"); foreach (XmlNode node in connNodes) { string connName = node.Attributes["name"]?.Value; string connString = node.Attributes["connectionString"]?.Value; if (!string.IsNullOrEmpty(connName) && !string.IsNullOrEmpty(connString)) { // 处理读取到的连接字符串 } }
使用LINQ to XML的示例:
using System.Xml.Linq; XDocument configXDoc = XDocument.Load(@"C:\YourProject\file2.ddl.config"); var connStringList = configXDoc.Descendants("add") .Where(x => x.Parent.Name.LocalName == "connectionStrings") .Select(x => new { Name = x.Attribute("name")?.Value, ConnectionString = x.Attribute("connectionString")?.Value }); foreach (var item in connStringList) { if (!string.IsNullOrEmpty(item.Name) && !string.IsNullOrEmpty(item.ConnectionString)) { // 这里添加你的业务逻辑处理 } }
内容的提问来源于stack exchange,提问作者Valentina Martinez
相关产品推荐
相关产品推荐

