试图读取连接字符串时出现了NullReferenceException异常

8

我有两个项目。一个是Web项目,另一个是Windows Forms项目。Web项目连接到数据库,但Windows项目抛出了NullReferenceException异常,读取连接字符串。

我正在使用相同的类来连接这两个项目。连接是使用LINQTOSQL建立的。

这是我的连接字符串:

<connectionStrings>
    <add name="GPSystemConnectionString"
         connectionString="Data Source=.;Initial Catalog=GPSystem;User ID=***;Password=***"
         providerName="System.Data.SqlClient" />
</connectionStrings>

这是我阅读它的方式。

string CS = ConfigurationManager.ConnectionStrings["GPSystemConnectionString"].ConnectionString;

(此行代码发生异常)..... (对象引用未设置为对象实例。)

注意:我正在使用相同的类来连接两个项目.... 一个连接成功,另一个失败。

请有人帮助我解决这个问题!

提前感谢您。


5
你需要在app.config(WinForms)和web.config(Web项目)中都有适当的条目 - 这些配置是针对执行程序集读取的,而不是共享的。 - user2864740
@user2864740:可以分享它们。请看我的回答。 - Patrick Hofman
@PatrickHofman 你的答案实际上就是窃取了配置;-) - user2864740
@user2864740:是不是太棒了?;) 我经常使用这个。我有自己的ORM映射,可以从ExecutingAssembly中读取配置文件。这种方法非常有用。 - Patrick Hofman
如果您想将一个文件用于两个项目,您需要将其包含在应用程序中。如果 Web 项目可以读取配置文件,则可以使用以下方式处理另一个项目:var configs = new ConfigurationBuilder().AddXmlFile(Path.Combine(AppContext.BaseDirectory, "same.config")).Build(); 请查看 Configuration Builder - Parsa S
4个回答

12

你需要在你的Windows应用程序的app.config中添加连接字符串的条目。

如果你没有App.Config文件,那就添加它。

并像下面这样添加条目:

<?xml version="1.0"?>
<configuration>
  <connectionStrings>
    <add name="GPSystemConnectionString"  connectionString="..." />
  </connectionStrings>
</configuration> 
在你的.cs文件中。
using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;

var connectionString=ConfigurationManager.ConnectionStrings["GPSystemConnectionString"].ConnectionString;

8

当数据访问层与可执行文件不在同一项目/库中时,我经常遇到ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString的空引用问题。我通常使用以下方法来帮助调试运行时配置文件的位置:

var configfile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var path = configfile.FilePath;

这是一个很好的提示,可以找出根本原因。当我在单元测试项目中测试LinqToSql代码时,遇到了同样的问题。最后,我不得不在单元测试项目的app.config中添加连接字符串。 - Cary
@fradsham - 好的提示! - Matthew

4
如果你想从另一个程序集中获取配置节,请使用以下方法:

获取另一个程序集中的配置节

Assembly assembly = ...; /* get the assembly to read config from */

System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(assembly.Location);

string CS = configuration.ConnectionStrings["GPSystemConnectionString"].ConnectionString;

иҝҷдёӘиғҪз”ЁжқҘд»ҺWinFormsеә”з”ЁзЁӢеәҸи®ҝй—®web.configеҗ—пјҲиҖҢдёҚжҳҜеҸҰдёҖдёӘеә”з”ЁзЁӢеәҸзҡ„app.configпјүпјҹжҲ‘д»ҘеүҚд»ҺжңӘдҪҝз”ЁиҝҮиҝҷдёӘгҖӮ - user2864740
@user2864740:OP说它共享类,所以我猜它也共享一个公共程序集。在这种情况下,这是一个不错的解决方案。读取web.config也是可能的,但你需要使用WebConfigurationManager - Patrick Hofman

0
在我的情况下,这个问题是由于我的64位 Machine.Config 中的 ConnectionString 引起的。

C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\Config

与标准的32位不同

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Config

要进行更正,请在项目属性的“生成”选项卡中取消“偏好使用 32 位”的设置。 项目的生成选项卡


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接