白得的分您要吗?---关于读取配置文件的问题

shixiujin 2010-05-01 09:57:22
在动态读取配置文件已命名的单个连接字符串中我遇到了一个这样的问题.我创建了一个控制台应用程序,而后又添加了一个"应用程序配置文件",此后我并没有向其中添加任何连接字符串.并想在运行时动态的读取其中的连接字符串.但是问题也就随之而来了.
相关代码如下:

using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
public class UseConfigurationManager
{
static void Main()
{
string connStringName = "NorthwindConnectionString";

//问题一: 如果配置文件中没有添加连接字符串节点,此时setting得到的值是什么?
//在下面的if语句判断中如何进行判断?
ConnectionStringSettings setting = ConfigurationManager.ConnectionStrings[connStringName];

if(setting == null)
{
setting = new ConnectionStringSetting();
setting.Name = connStringName;
setting.ConnectionString = RetrieveConnectionString();

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLever.None);
config.ConnectionStrings.ConnectionStrings.Add(setting);
config.Save();

//问题二:假定已经向配置文件中添加了指定名称的连接字符串,我除了在运行时可以读取到该连接字符串
//能否在程序停止运行后或在运行时通过查看config文件来实际查看该config文件的连接字符串.
}
}
}
...全文
426 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
shixiujin 2010-05-03
  • 打赏
  • 举报
回复
这个点钟是不是高手们都睡了?
t316562725 2010-05-03
  • 打赏
  • 举报
回复
不懂帮顶
shixiujin 2010-05-03
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 zzx509 的回复:]
之所以有两个文件app.config和app.config.config是因为ConfigurationManager.OpenExeConfiguration(string exeFile)
这个打开方法的参数一般是一个执行文件(不会检查是否为执行文件),而不是直接的.config配置文件。

生成项目后,bin\debug目录下的配置文件默认是项目名.exe.config,你可以指定 O……
[/Quote]
看到您的回帖非常感谢.向您致敬了!
通过您的说明,我经过仔细的测试.
似乎问题并没有完全解决,还请您指点一二:(我添加了部分的代码)

string procName = Process.GetCurrentProcess().ProcessName + ".exe";
Configuration config = null;
config = ConfigurationManager.OpenExeConfiguration(procName);
config.ConnectionStrings.ConnectionStrings.Add(setting);
config.Save();


使用当前进程的可执行文件作为读取Configuration对象的条件,虽然在Debug文件下面没有生成App.config.config这个配置文件,但是却生成了以当前进程名称加.exe.config这样的一个配置文件.
为啥总是多出一个配置文件呢?
通过生成的顺序可知:
通过File.Create(fileName).Close(); 创建的是App.config文件
捷哥1999 2010-05-03
  • 打赏
  • 举报
回复
或者,不用ExeConfigurationFileMap类,这样也是可以的!


static void Main(string[] args)
{
string fileName = Process.GetCurrentProcess().ProcessName + ".exe.config";

if (!File.Exists(fileName))
{
ConnectionStringSettings setting = null;
setting = ConfigurationManager.ConnectionStrings["Northwind"];

SqlConnectionStringBuilder csb = new SqlConnectionStringBuilder();
csb.DataSource = "(local)";
csb.InitialCatalog = "Northwind";
csb.IntegratedSecurity = true;
setting = new ConnectionStringSettings("Northwind", csb.ConnectionString);

string procName = Process.GetCurrentProcess().ProcessName + ".exe";
Configuration config = null;
config = ConfigurationManager.OpenExeConfiguration(procName);
config.ConnectionStrings.ConnectionStrings.Add(setting);
config.Save();
}
}
捷哥1999 2010-05-03
  • 打赏
  • 举报
回复
shixiujin,你的第二个问题,是希望在程序运行时,如果没有缺省的配置文件,就自己创建一个配置文件,这个时候,可以使用ExeConfigurationFileMap 类,具体的使用方法,就是wuyq11提供的那样。
wuyq11 2010-05-03
  • 打赏
  • 举报
回复
Configuration C=ConfigurationManager.OpenExeConfiguration(String .Empty);
C.AppSettings.Settings["Server"].Value = "";
C.AppSettings.Settings["Database"].Value = "";
C.Save(ConfigurationSaveMode.Modified);

private static string GetConnectionStringsConfig(string connectionName)
{
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = Application.StartupPath + @"\a.exe.config";
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
return config.ConnectionStrings.ConnectionStrings[connectionName].ConnectionString.ToString();
}
zzx509 2010-05-03
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 shixiujin 的回复:]
使用当前进程的可执行文件作为读取Configuration对象的条件,虽然在Debug文件下面没有生成App.config.config这个配置文件,但是却生成了以当前进程名称加.exe.config这样的一个配置文件.
[/Quote]
似乎你还是未理解配置文件的意思。假设你的项目为a,生成的执行文件名为a.exe。你的代码:
config = ConfigurationManager.OpenExeConfiguration(procName);
config.ConnectionStrings.ConnectionStrings.Add(setting);
config.Save();
这几句就是打开a.exe文件的配置文件,存储后就是a.exe.config。
如果你将原a.exe改名为b.exe,再次运行后就是b.exe.config。

你在项目中通过添加新建项->配置文件添加的App.config,在生成项目a后,App.config是不存在的,配置文件的名称为a.exe.config,这个XML是原App.config中的内容。

shixiujin 2010-05-03
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 zzx509 的回复:]
引用 25 楼 shixiujin 的回复:
使用当前进程的可执行文件作为读取Configuration对象的条件,虽然在Debug文件下面没有生成App.config.config这个配置文件,但是却生成了以当前进程名称加.exe.config这样的一个配置文件.

似乎你还是未理解配置文件的意思。假设你的项目为a,生成的执行文件名为a.exe。你的代码:
config = Config……
[/Quote]
真是太感谢您了,我现在才明白是怎么回事。人为添加看来只是画蛇添足啊.(看了您提供的代码没有理解真正的含义才闹出了这个笑话).向您学习了。

同时感谢阿捷,几天来一直对我的帮助。我向您致敬,谢谢了!
并感谢wuyq11给于代码支持!

结贴给分!谢谢大家!
捷哥1999 2010-05-02
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 zzx509 的回复:]

1.楼主应该是在VS环境的DEBUG模式下运行,这与直接双击运行exe文件是有区别的。
实际运行的情况是断点调试所用的配置文件是exe前面带.vhost的,每次调式都重新生成这个配置文件。

[/Quote]

这个判断是对的,如果你在debug模式下,程序判断到没有那个配置信息,添加后,你是看不到exe.config文件被修改的,它的内容保持不变,但是如果你到debug目录下双击执行文件,同样的情况下,你会看到exe.config文件被修改了。
yufenghua 2010-05-02
  • 打赏
  • 举报
回复
我是来接分的。。。
zzx509 2010-05-02
  • 打赏
  • 举报
回复
1.楼主应该是在VS环境的DEBUG模式下运行,这与直接双击运行exe文件是有区别的。
实际运行的情况是断点调试所用的配置文件是exe前面带.vhost的,每次调式都重新生成这个配置文件。
2.双击exe文件运行的情况:
string connStringName = "NorthwindConnectionString";在配置文件是不存在的,末尾少了s。
第一次运行时,新增一个节点,加上原有的connectionStrings下共有2个节点。
再次运行没有变化,因节点已经存在了。
捷哥1999 2010-05-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 shixiujin 的回复:]
如果将我添加注释部分的已命名的连接字符串将其注释去掉,的确setting得到的值的确是一个null值.
但是我在程序中并没有添加该部分,所以才有文中提到的问题.
[/Quote]

如果没有注释掉,就不会执行那个判断中的语句了,有什么问题吗?
zzx509 2010-05-02
  • 打赏
  • 举报
回复
之所以有两个文件app.config和app.config.config是因为ConfigurationManager.OpenExeConfiguration(string exeFile)
这个打开方法的参数一般是一个执行文件(不会检查是否为执行文件),而不是直接的.config配置文件。

生成项目后,bin\debug目录下的配置文件默认是项目名.exe.config,你可以指定 OpenExeConfiguration的方法参数为ConfigurationUserLevel.None或者是生成的exe文件名,再次注意不是直接指定配置文件名。

你所创建的app.config和app.config.exe与当前项目的配置没有关系。
另外AppDomain.CurrentDomain.BaseDirectory路径末尾带\,所以多加\后造成文件名非法。
这句代码的问题:config = ConfigurationManager.OpenExeConfiguration(basePath); //问题
上面已经描述了。

mars199 2010-05-02
  • 打赏
  • 举报
回复
不懂帮顶
shixiujin 2010-05-02
  • 打赏
  • 举报
回复
通过此次的学习,真是长了见识.
但是也请诸位高手再为我解答一个相关的问题,代码如下只是在运行时出现了错误:

using System;
using System.IO;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
public class Test{
static void Main(string[] args)
{

string basePath = AppDomain.CurrentDomain.BaseDirectory;

string fileName = basePath + "\\App.config";
Console.WriteLine("程序基目录为: {0}", fileName);

if (!File.Exists(fileName))
File.Create(fileName).Close();

string configName = "Northwind";

AddConfig(configName,basePath);

}

static void AddConfig(string configName,string basePath)
{
ConnectionStringSettings setting = null;
setting = ConfigurationManager.ConnectionStrings[configName];

if (setting == null)
{
Console.WriteLine("配置文件中不存在名为:{0}的配置文件项,正在动态构造...",configName);
SqlConnectionStringBuilder csb = new SqlConnectionStringBuilder();
csb.DataSource = "(local)";
csb.InitialCatalog = "Northwind";
csb.IntegratedSecurity = true;
setting = new ConnectionStringSettings(configName, csb.ConnectionString);

Configuration config = null;
config = ConfigurationManager.OpenExeConfiguration(basePath); //问题
//Console.WriteLine(config.FilePath);
config.ConnectionStrings.ConnectionStrings.Add(setting);
config.Save();

}
}
}

在这里我的应用程序抛出了异常,我并没有使用try/catch进行扑捉.
问题原因如下:
若使用basePath路径进行创建App.config文件的话,将出现上面的情况(抛出异常).
而使用fileName创建App.config文件的话,异常没了,但是在Debug文件夹下却出现两个config文件
分别为:App.config和App.config.config文件
这是咋回事?能否给于说明一下?这样正常吗?
请给点关键性的代码,不胜感激!

(我将帖子分再增加20分,以表示对大家的支持!)
celeron729 2010-05-02
  • 打赏
  • 举报
回复
哈,试试不就知道了!!!!!!!!!!
shixiujin 2010-05-02
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 zzx509 的回复:]
1.楼主应该是在VS环境的DEBUG模式下运行,这与直接双击运行exe文件是有区别的。
实际运行的情况是断点调试所用的配置文件是exe前面带.vhost的,每次调式都重新生成这个配置文件。
2.双击exe文件运行的情况:
string connStringName = "NorthwindConnectionString";在配置文件是不存在的,末尾少了s。
第一次运行时,新增一个节点,加……
[/Quote]
感谢更要感谢您了,一语说出了我一直没有发现的问题.谢谢您!
同时也感谢@阿捷,一直给我帮助!
shixiujin 2010-05-02
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 mngzilin 的回复:]
C# code
string cfgfile = AppDomain.CurrentDomain.BaseDirectory + "\\App.config";
if (!System.IO.File.Exists(cfgfile))
System.IO.File.Create(cfgfile).Close();
string connStringName = "abc";
Co……
[/Quote]
感谢您提供的代码,从中学习了很多.
mngzilin 2010-05-02
  • 打赏
  • 举报
回复
string cfgfile = AppDomain.CurrentDomain.BaseDirectory + "\\App.config";
if (!System.IO.File.Exists(cfgfile))
System.IO.File.Create(cfgfile).Close();
string connStringName = "abc";
Configuration config = ConfigurationManager.OpenExeConfiguration(cfgfile);
ConnectionStringSettings setting = config.ConnectionStrings.ConnectionStrings[connStringName];
if (setting == null)
{
setting = new ConnectionStringSettings();
setting.Name = connStringName;
setting.ConnectionString = "12313132";
config.ConnectionStrings.ConnectionStrings.Add(setting);
config.Save();
}
rizher 2010-05-01
  • 打赏
  • 举报
回复
不清楚 帮顶一下好了!!
加载更多回复(12)

110,544

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧