无法获取app.config值“connectionStrings”?

时间:2013-12-14 08:44:05

标签: c#

我在visual studio中编写程序,现在我无法获得app.config的价值:

我的app.config:

 <?xml version="1.0"?>
    <configuration>  
        <connectionStrings>
            <add name="connStr" connectionString="Data Source=Dolphin-PC;Initial Catalog=jsptpd_SYS;Persist Security Info=True;User ID=sa;Password=ccir"/>
        </connectionStrings>        
    </configuration>

我尝试获取值的代码:

          try
            {
              con2 = System.Configuration.ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
                logger.Info("try to get connectionstr success:" + connStr);
            }
            catch(Exception ex)
            {
                logger.Info("try to get connectionstr failed:" + ex.ToString());
            }

日志的输出:

 2013-12-14 16:22:28,710 [1] INFO  ApplicationInfoLog [(null)] <(null)>     
 - try to get connectionstr failed:System.NullReferenceException:     
   object reference not set to instance. 
   on Jsptpd.JobScheduler.jsptpdJobScheduler..ctor() 
   location D:\jsptpd\Code\jsptpdJobScheduler\jsptpdJobScheduler\jsptpdJobShedule.cs:line  46

哪里错了?

为什么无法读取ConnectionStrings?

3 个答案:

答案 0 :(得分:2)

您的部分声明为NameValueSectionHandler。正如这个article指出的那样,这个处理程序返回一个NameValueCollection,而不是之后将它强制转换为的IDictionary。这就是as IDictionary导致空值的原因 将您的部分声明为DictionarySectionHandler或将IDictionary更改为NameValueCollection。

答案 1 :(得分:1)

如果您发布的配置确实是您所拥有的,那么该配置就是完全错误的....您有两个嵌套的 <configuration>部分 - 这些都不会工作!

如果您的配置看起来像您发布的内容,则需要将其更改为如下所示:

<?xml version="1.0"?>
<configuration>            <!-- one and ONLY one <configuration> node! -->
   <configSections>        <!-- directly under <configuration> -->
      <section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
   <configSections>

   <connectionStrings>     <!-- directly under <configuration> -->
       <add name="connStr" connectionString="Data Source=Dolphin-PC;Initial Catalog=jsptpd_SYS;Persist Security Info=True;User ID=sa;Password=ccir"/>
   </connectionStrings>

   <quartz>                <!-- directly under <configuration> -->
      ...........
   </quartz>    

   <appSettings>           <!-- directly under <configuration> -->
       <add key="connStr" value="Data Source=Dolphin-PC;Initial Catalog=jsptpd_SYS;Persist Security Info=True;User ID=sa;Password=ccir"/>
   </appSettings>
</configuration>

应该只有一个 <configuration>部分以及所有其他标记,例如<configSections><quartz><connectionStrings>和{{1}应该直接在唯一的<appSettings>元素

答案 2 :(得分:0)

检查您的app.config文件属性集,确保Generate Operation not embeded resource

因为您通过ConfiguationManager类读取app.config,所以配置读取文件如下:

http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.aspx

•整体读写配置文件。您的应用程序可以在本地或远程本地或其他应用程序或计算机上读取和写入任何级别的配置设置。使用ConfigurationManager类提供的方法之一打开配置文件,如SampleApp.exe.config。这些方法返回一个Configuration对象,该对象又公开了可用于处理关联配置文件的方法和属性。这些方法执行读取或写入操作,并在每次写入文件时创建配置数据。

如果您设置嵌入资源,则bin方向无法生成 SampleApp.exe.config 文件,因此ConfigurationManager可以读取您的配置文件。

因此,如果您想纠正问题,请执行此操作

在visual studio的资源管理器中选择app.config文件:

将副本设置为outout dirctionary

No copy

generte operation设置为:

None

问题将解决。