问题  app.config与linq to sql一起使用

贾西

新成员
已加入
2012年4月14日
留言内容
3
编程经验
1-3
在C#2008应用程序中,我使用linq to sql连接到sql server 2008数据库。现在我想从数据库获取数据库的连接
app.config文件,而不是将值硬编码到应用程序中。我希望能够更改与数据库的连接字符串,因为我要将这个应用程序从单元测试数据库移动到用户接受数据库,再到生产数据库。
现在,我收到错误消息,""你调用的对象是空的。"我知道此错误消息来自下面列出的代码行,因为这是我更改的唯一代码行。
以下是* .designer.cs文件(这是dbml文件的一部分)中的代码的片段。

使用System.Configuration;
公共esampleDataContext():
base(ConfigurationManager.ConnectionStrings ["sample.Properties.Settings.DEVConnectionString"] .ConnectionString,mappingSource)
**注意:base(global :: sample.Properties.Settings.Default.DEVConnectionString,mappingSource)是我替换的由
.net framework
我想提及以下内容:
1. * .dbml文件与特定的项目文件关联。
2.此* .dbml文件的连接字符串设置如下:
一种。 DEVConnectionString(设置)
b。连接字符串=数据源= dev1;初始目录= DEV_test;集成安全性= True
C。应用程序设置=真
d。设置属性名称为DEVConnectionString。
3.具有* .dbml文件的项目文件。有对system.configuration的引用集。
**注意:此代码在我编写的类似应用程序中,但是我不明白为什么它在这里不起作用。
因此,您可以告诉我,向我展示代码,和/或指向我可以使用的引用,以便我可以在app.config文件中获取想要使用的数据库连接字符串的值。我不想对数据库使用硬编码的连接字符串。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,525
地点
悉尼,澳大利亚
编程经验
10+
我首先不知道您要做什么,但是LINQ to SQL的默认设置是将其连接字符串存储在配置文件中,就像我在VS中使用过的所有数据工具一样。我刚刚创建了一个测试应用程序,添加了SQL Server Express数据库,并将表从Server Explorer拖到LINQ to SQL设计图面上。这是我的App.config文件的内容,它们都是自动生成的:
C#:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
        [COLOR="#FF0000"]<add name="LinqToSqlTest.Properties.Settings.TestConnectionString"
            connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\Test.mdf;Integrated Security=True"
            providerName="System.Data.SqlClient" />[/COLOR]
    </connectionStrings>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>
这是我的LINQ to SQL模型的自动生成的构造函数:
C#:
public TestDataContext() : 
		base([COLOR="#FF0000"]global::LinqToSqlTest.Properties.Settings.Default.TestConnectionString[/COLOR], mappingSource)
{
	OnCreated();
}

public TestDataContext(string connection) : 
		base(connection, mappingSource)
{
	OnCreated();
}

public TestDataContext(System.Data.IDbConnection connection) : 
		base(connection, mappingSource)
{
	OnCreated();
}

public TestDataContext(string connection, System.Data.Linq.Mapping.MappingSource mappingSource) : 
		base(connection, mappingSource)
{
	OnCreated();
}

public TestDataContext(System.Data.IDbConnection connection, System.Data.Linq.Mapping.MappingSource mappingSource) :
		base(connection, mappingSource)
{
	OnCreated();
}
如您所见,默认情况下,无参数构造函数使用配置文件中的连接字符串。我没有必要做任何事情来实现这一目标。

无论如何,您基本上都不会手动编辑设计者生成的文件。如果要更改设计人员生成的代码,请在生成代码的设计人员中进行更改。对于LINQ to SQL,这意味着在设计器中打开模型,单击一些空白区域,然后打开“属性”窗口。在底部,您将看到Connection属性。您可以在此处选择现有的连接字符串或创建一个新的连接字符串。如果创建一个新文件,则默认情况下它将被添加到配置文件中。我是在测试项目中做到这一点的,这是配置文件的样子:
C#:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
        <add name="LinqToSqlTest.Properties.Settings.TestConnectionString"
            connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\Test.mdf;Integrated Security=True"
            providerName="System.Data.SqlClient" />
[COLOR="#FF0000"]        <add name="LinqToSqlTest.Properties.Settings.ReportServerConnectionString"
            connectionString="Data Source=PICARD;Initial Catalog=ReportServer;Integrated Security=True"
            providerName="System.Data.SqlClient" />[/COLOR]
    </connectionStrings>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>
这是LINQ to SQL模型的构造函数:
C#:
public TestDataContext() : 
		base([COLOR="#FF0000"]global::LinqToSqlTest.Properties.Settings.Default.ReportServerConnectionString[/COLOR], mappingSource)
{
	OnCreated();
}

public TestDataContext(string connection) : 
		base(connection, mappingSource)
{
	OnCreated();
}

public TestDataContext(System.Data.IDbConnection connection) : 
		base(connection, mappingSource)
{
	OnCreated();
}

public TestDataContext(string connection, System.Data.Linq.Mapping.MappingSource mappingSource) : 
		base(connection, mappingSource)
{
	OnCreated();
}

public TestDataContext(System.Data.IDbConnection connection, System.Data.Linq.Mapping.MappingSource mappingSource) :
		base(connection, mappingSource)
{
	OnCreated();
}
我并没有写所有的代码。一切都基于设计师。
 

贾西

新成员
已加入
2012年4月14日
留言内容
3
编程经验
1-3
我原始的自动生成的代码看起来像您的基本(全局:: sample.Properties.Settings.Default.DE VConnectionString,mappingSource)。只要我停留在同一数据库上,该代码就可以工作。但是,一旦将应用程序移至其他数据库,就不会使用app.config文件中的新值。原始数据库连接字符串值以某种方式变得硬编码在应用程序中。为了将应用程序移至新数据库,我进行了全局搜索并替换了数据库连接字符串。
我不想在应用程序中保留硬编码的值。您能告诉我我需要与生成代码的设计器做什么,以便使用app.config文件中的值吗?
我一直在与生成自动生成的代码的设计器合作,但是我还没有找到使我的代码工作的方法。
你有什么建议?是否应该在app.config文件中为该应用程序将附加到的每个数据库设置新的数据库连接字符串?基本上,该应用程序将被移至3个不同的数据库。这是否意味着我应该在app.config文件中为该应用程序要连接的3个不同数据库设置3个不同的数据库连接?
因此,您能告诉我该怎么做,以便应用程序真正使用app.config文件中的值吗?
 
Last edited:

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,525
地点
悉尼,澳大利亚
编程经验
10+
因此,您能告诉我该怎么做,以便应用程序真正使用app.config文件中的值吗?
这就是我在上一篇文章中所做的。将连接字符串放在配置文件中的全部目的是可以手动编辑它。如果要连接到其他数据库,则可以在配置文件中更改连接字符串。代码没有更改,因此模型从配置文件中加载了相同的连接字符串,但是该连接字符串的值将发生更改。如果您知道将要使用的多个值,则可以简单地在配置文件中制作同一设置的多个副本,并注释掉当前未使用的副本。
 

贾西

新成员
已加入
2012年4月14日
留言内容
3
编程经验
1-3
由于我的应用程序未使用app.config文件,因此自动生成代码的设计器工具可能会出现什么问题?肯定有我设置不正确的东西。
要查看属性,我首先选择可视设计器,然后在设计器的空白区域中单击鼠标右键,然后看到其他属性。然后,我选择连接设置。连接设置应该是什么?
 
最佳 底部