使用来自web.config而不是app.config的connectionstring

时间:2011-02-09 13:06:46

标签: asp.net .net connection-string tableadapter

我有一个类库项目,其中我添加了一个与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应用程序项目的设置设计器添加了一个连接字符串。我给了上面的密钥来引用它。但是,上述规则似乎抛出了一个空引用异常。

5 个答案:

答案 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"; }
     }
 }