在我的代码隐藏页面中,如何访问存储在web.config文件中的连接字符串?
我有一个应用程序在32位系统上运行良好,但在XP 64位系统上失败.我已将其跟踪到我的app.config中定义的连接字符串,因此:
<connectionStrings>
<clear/>
<add name="IFDSConnectionString"
connectionString="Data Source=fdsdata;Initial Catalog=IFDS;
Trusted_Connection=true;Connect Timeout=0"
providerName="System.Data.SqlClient" />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)
当我尝试在代码中引用它时,我发现ConfigurationManager.ConnectionStrings集合仅包含来自machine.config文件的LocalSqlServer连接字符串,而不是我的自定义字符串.
另一个奇怪的是,当我从Visual Studio中运行应用程序时,它工作正常.只有当我用完release文件夹时才会定义连接字符串.应用程序的.exe.config文件与.exe文件一起位于release文件夹中,并且是最新的.
我正在尝试设置新工具JetBrains:DataGrip使用我的本地安装MS SQL Server 2014 Express.我花了一些时间试图将ms连接字符串"转换"为jdbc,但没有运气.我可以用连接MS SQL Server 2014 management Studio.
所以这是我的连接字符串:
"Data Source=MyPCName\MySQLInstanceName;Initial Catalog=MyDataBaseNameA3D;Integrated Security=True;"
Run Code Online (Sandbox Code Playgroud)
我最好的猜测基于msdn示例:
jdbc:sqlserver://[serverName[\instanceName][:portNumber]][;property=value[;property=value]]
Run Code Online (Sandbox Code Playgroud)
MSDN:使用JDBC驱动程序连接到SQL Server.构建连接URL
jdbc:sqlserver://MyPCName\MySQLInstanceName:1433;databaseName=MyDataBaseNameA3D;integratedSecurity=true;
Run Code Online (Sandbox Code Playgroud)
有没有人解决过这样的问题,也许可以指导我完成设置步骤?
否则我只是放弃这个工具.我浪费了足够的时间在一些非常简单的事情上.
我希望这是一个简单的问题:
你怎么能更改2个连接字符串在运行时的
Global.asax下Application_Start()
Web.config文件
<connectionStrings>
<add connectionString="DB1" value=""/>
<add connectionString="DB2" value=""/>
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)
Global.asax中
protected void Application_Start() {
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
Run Code Online (Sandbox Code Playgroud)
细节
在我开始询问为什么我这样做或我不应该这样做的原因之前,请参考以下文章Azure Key Vault连接字符串和N层设计.
基本上,我正在尝试使用带有N层应用程序的Key Vault.WebAPI通过以下方式定义连接字符串Web.config.为了避免硬编码连接字符串,它们将存储在Key Vault中.但是,由于使用的Unit Of Work模式,我不确定最佳路由,我目前正在尝试找出在运行时为Web API项目注入或更改连接字符串的潜在解决方案.
我正在尝试使用'Database'NLog目标,并希望NLog读取我的连接字符串,以避免在同一个配置文件中设置它两次.问题是我有一个Entity Framework样式的连接字符串,因此使用该connectionStringName属性不起作用.
在log4net中,我可以使用自定义AdoNetAppender并自己提取连接字符串的相应部分.有没有办法自定义NLog的数据库目标,所以我可以传入一个适当样式的连接字符串?
无论何时使用EF代码创建应用程序,您都可以看到添加了以下web.config键:
<add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient" />
Run Code Online (Sandbox Code Playgroud)
您可以很容易地看到它不包含特定于应用程序的信息.更改这些值不会影响应用程序的运行方式,因此我认为它必定是某种不必要的EF工件,可能是设计人员需要的.但是,如果完全删除此键,应用程序将在启动时抛出ConfigurationError.这把钥匙的真正目的是什么?
在Excel 2010中,在Data-Connections下,工作簿中存在所有连接的列表,其中有一个字段"Last Refreshed".这个字段对我来说总是空的.微软称(http://office.microsoft.com/en-001/excel-help/create-edit-and-manage-connections-to-external-data-HA010342379.aspx)"如果空白,那么连接从未已被刷新",但这显然不是这里的情况,因为我们经常刷新日期.
有什么想法吗?谢谢彼得
我的目标是在控制台应用程序中Where对ConfigurationManager.ConnectionStrings集合使用LINQ 查询(假设添加了System.Configuration引用的新的.NET 4.5控制台应用程序,以及相应的using声明).
我开始用这个,这并没有工作:
var relevantSettings =
ConfigurationManager.ConnectionStrings.Where(s => s.Name.StartsWith("Xyz"));
Run Code Online (Sandbox Code Playgroud)
它告诉我:
方法'
IEnumerable<TSource> System.Linq.Enumerable.Where<TSource(this IEnumerable<TSource>, Func<TSource,bool>)' 的类型参数不能从用法中推断出来.尝试明确指定参数.
这抓住了我措手不及,所以我想这个要检查我的理智,但是这并没有工作之一:
foreach (var settingsin ConfigurationManager.ConnectionStrings)
{
if (settings.Name.StartsWith("Xyz")) Console.WriteLine("Found one!");
}
Run Code Online (Sandbox Code Playgroud)
它抱怨没有有关foreach声明,但对.Name位,出现错误:
无法解析符号'名称'
据我所知,有可能是一些防止编译器推断var的类型,仔细检查,我想这其中做的工作:
foreach (ConnectionStringSettings settings in ConfigurationManager.ConnectionStrings)
{
if (connectionString.Name.StartsWith("Xyz")) Console.WriteLine("Found one!");
}
Run Code Online (Sandbox Code Playgroud)
然而,除了解决我的直接问题外,这对我没什么帮助.我想了解这里发生了什么.
我想要做的就是使用一个简单的LINQ Where语句来获取app.config中连接字符串的子集.为什么编译器阻止我这样做?
我通过web api公开我的存储库操作.存储库已使用实体框架和工作单元模式实现.我有很多相同数据库的实例.每个代表不同客户的数据.现在的问题是如何通过每个webapi调用动态设置连接字符串?我应该每次调用都获得连接字符串参数吗?或者我应该为每个客户端托管网络Api?
当我打开SQL命令行时,我写CONNECT username/password@[//]host[:port][/service_name],它将我连接到数据库就好了.但是,我无法使用连接字符串从.NET项目连接.我尝试了许多诸如<add name="ConnectionString" connectionString="Data Source=username/password@[//]host[:port][/service_name];" />和之类的东西<add name="ConnectionString" connectionString="server=tcp:host;Initial Catalog=service_name; user id=username; password=password; Connection Timeout=180;" providerName="System.Data.OracleClient" />,但迄今为止没有任何工作.每当我进入sconn.Open();以下内容时:
var CurrentConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
SqlConnection sconn = new SqlConnection(CurrentConnectionString);
sconn.Open();
Run Code Online (Sandbox Code Playgroud)
我几乎总是得到以下错误:
建立与SQL Server的连接时发生与网络相关或特定于实例的错误.服务器未找到或无法访问.验证实例名称是否正确,以及SQL Server是否配置为允许远程连接.(提供程序:SQL网络接口,错误:25 - 连接字符串无效)
如何正确连接到数据库?
.net ×5
c# ×5
web-config ×2
32bit-64bit ×1
app-config ×1
asp.net-mvc ×1
datagrip ×1
excel ×1
jdbc ×1
linq ×1
nlog ×1
oracle ×1
sql-server ×1