我有一个类库项目,其中我添加了一个与sql server对话的数据集。此项目的输出将从Web应用程序 项目 中消耗。所以我打算将我的连接字符串放在Web应用程序项目中。
做了几件事。为了使我的适配器使用不同的连接字符串,我遇到了this。但我终于发现了以下方便:
Dim adapter as New MyReqeustTableAdapter()
adapter.Connection.ConnectionString = sMyConnectionString
然后我尝试从我的配置(app.config)获取连接字符串到模拟。我用关键字“myconstr”手动添加了一个部分。我的想法是做一些像:
sMyConnectionString = ConfigurationManager.ConnectionString("myconstr").ConnectionString
但是我的intellisense无法检测到ConfigurationManager。因此必须为项目添加适当的引用。
接下来,我通过Web应用程序项目的设置设计器添加了一个连接字符串。我给了上面的密钥来引用它。但是,上述规则似乎抛出了一个空引用异常。
答案 0 :(得分:1)
假设您已经创建了一个类库。在其中,您已经定义了一个Settings属性,如:
Properties.Settings.Default.ProjectName
Visual Studio可能会自动为您生成一些配置,如下所示:
(app.config)中
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="MyDllProject.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<applicationSettings>
<MyDllProject.Properties.Settings>
<setting name="ProjectName" serializeAs="String">
<value>MyDllproject</value>
</setting>
</MyDllProject.Properties.Settings>
</applicationSettings>
</configuration>
现在假设您将此程序集添加到项目中。并且您访问其设置,您最有可能获得MyDllproject
值。尽管添加了任何配置。为什么?因为当生成程序集时,它就被写入了它。并且编写的代码使得在没有配置覆盖的情况下使用在生成时在app.config中定义的内容。
现在在目标项目中,您只需在配置文件中添加以下模式中的必要部分
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<!-- start: copied from app.config of class library -->
<section name="MyDllProject.Properties.Settings"
type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"
/>
<!-- end: copied from app.config of class library -->
<!-- other sections may follow -->
</sectionGroup>
</configSections>
<applicationSettings>
<!-- remember to maintain the same order as how it was defined in the sectionGroup -->
<!-- start: copied from app.config of class librarly -->
<MyDllProject.Properties.Settings>
<setting name="ProjectName" serializeAs="String">
<value>ConsoleProjectB</value>
</setting>
</MyDllProject.Properties.Settings>
<!-- end: copied from app.config of class library -->
<!-- other configurations settings may follow -->
</applicationSettings>
</configuration>
多数民众赞成。
以下是我为此链接的一个小项目示例:http://sdrv.ms/16ksPef
答案 1 :(得分:0)
您可以添加对System.Web
的引用,并使用类库项目中的System.Web.Configuration.WebConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString)
答案 2 :(得分:0)
在类库项目中定义的配置文件(app.config
)无法由系统自动使用。唯一可以使用的配置文件是Web应用程序中的web.config
文件或exe文件为*myexe.exe*.config
的exe应用程序中的*myexe.exe*
。
所以你似乎试图将app.config
添加到类库中。那不行。
可以将第二个配置文件链接到web.config
,但这个问题对你没有帮助。
答案 3 :(得分:0)
基本上,您需要的是可以从外部更改库的全局参数。单独使用app.config并不能立即为您提供这种可能性 - 您尚未公开库内部设置。考虑到这一点,实现曝光的一种非常直接的方法是在库中为app.config创建一个分配器。
public static class Setter
{
public static void Set(string name, string value)
{
Properties.Settings.Default[name] = value;
}
}
然后,在web应用程序中启动global.asax或其他地方:
MyLibrary.Setter.Set("X", ConfigurationManager.ConnectionStrings["Y"].ConnectionString);
答案 4 :(得分:-1)
从您的问题我认为您正在构建一个n层应用程序。我认为你提到的两个选项会更好。
您应该为DAL(数据访问层)类创建一个基类,该类具有包含连接字符串的公共属性。
btw它可以帮助您隐藏/保护您的连接字符串,而不是将其存储在一个文件中,任何拥有或获得对您主机的访问权限的人都可以轻松阅读
public class DALBase { public static string connString { get { return "Data Source=localhost\\SqlExpress;Initial Catalog=theDb Integrated Security=True"; } } }