0

我有一个类库项目,我在其中添加了一个与 sql server 对话的数据集。此项目的输出将从 Web 应用程序项目中使用。所以我打算把我的连接字符串放在 web 应用程序项目中。

做了几件事。为了让我的适配器使用不同的连接字符串,我遇到了这个. 但我终于发现做以下方便:

Dim adapter as New MyReqeustTableAdapter()
adapter.Connection.ConnectionString = sMyConnectionString

然后我尝试从我的配置(app.config)中获取连接字符串来模拟。我使用键“myconstr”手动添加了一个部分。我的想法是做类似的事情:

sMyConnectionString = ConfigurationManager.ConnectionString("myconstr").ConnectionString

但我的智能感知无法检测到 ConfigurationManager。所以只好在项目中添加适当的引用。

接下来,我通过 Web 应用程序项目的设置设计器添加了一个连接字符串。我给出了上面的键来引用它。然而,上面的语句似乎抛出了一个空引用异常。

4

5 回答 5

1

假设您已经创建了一个类库。在其中您定义了一个 Settings 属性,如下所示:

Properties.Settings.Default.ProjectName

Visual Studio 可能会自动为您生成一些配置,如下所示:

(app.config) </p>

<?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 中定义的内容。

现在在您的目标项目中,您只需按照以下模式在配置文件中添加必要的部分

&lt;?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

于 2013-09-11T14:56:54.110 回答
0

您可以添加对类库项目的引用System.Web和使用System.Web.Configuration.WebConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString)

于 2011-02-09T13:13:55.653 回答
0

在类库app.config项目中定义的配置文件 ( )不能被系统自动使用。唯一可以使用的配置文件是web 应用程序或exe 应用程序中的文件,其中 exe 文件为.web.config*myexe.exe*.config*myexe.exe*

因此,您似乎正在尝试添加app.config到类库中。那是行不通的。

可以将第二个配置文件链接到,web.config但这可能对您没有帮助。

于 2011-02-09T13:14:10.710 回答
0

基本上,您需要的是从外部更改库的全局参数的可能性。单独使用 app.config 并不能立即为您提供这种可能性——您还没有公开您的库内部设置。考虑到这一点,实现曝光的一种非常简单的方法是在您的库中为 app.config 创建一个分配器。

public static class Setter
{
    public static void Set(string name, string value)
    {
        Properties.Settings.Default[name] = value;
    }
}

然后,在 global.asax 或其他地方启动 web 应用程序:

MyLibrary.Setter.Set("X", ConfigurationManager.ConnectionStrings["Y"].ConnectionString);
于 2011-03-07T07:47:11.717 回答
-1

根据您的问题,我认为您正在构建一个 n 层应用程序。我认为您最好选择您提到的两个选项。

您应该为 DAL(数据访问层)类创建一个基类,该类将具有包含该连接字符串的公共属性。

顺便说一句,它将帮助您隐藏/保护您的连接字符串,而不是将其存储在一个文件中,任何拥有或获得访问您主机的人都可以轻松读取的文件

 public class DALBase
 {
     public static string connString
     {
         get { return "Data Source=localhost\\SqlExpress;Initial Catalog=theDb Integrated Security=True"; }
     }
 }
于 2011-03-07T08:30:19.817 回答