我想知道在.Net应用程序中维护与数据库连接的最佳方法是什么(ADO.NET,但我想任何数据层的实践应该是相同的).我应该创建一个数据库连接并在我的应用程序中传播它,还是最好只需要传递连接字符串/工厂并创建一个ad-hoc连接.
据我所知,性能打击对于池并不显着,它允许我很容易地从断开的连接中恢复(只是创建一个新的连接)但是再一次连接对象是一个很好的,相对高级的抽象并创建一个新的连接对于每个操作(不是SQL命令,但是应用程序操作)会生成额外的重复代码,感觉就像浪费时间/资源(?).
您如何看待这两种情况,它们的缺点/优点以及您在实际应用中使用的方法是什么?
谢谢
这个wiki帖子概述了问题和解决方案.我想发布这个可能有类似问题的其他人,因为我找不到任何具体的解决方案来解决其他问题.
我们最近将SQL Server 2000数据库升级到SQL Server 2005.服务器上的一个数据库是MS Access数据库的后端.MS Access数据库使用传递查询,通过无DSN的ODBC连接到SQL Server.
无DSN连接字符串的示例如下所示:
ODBC; DRIVER=SQL Server;SERVER=servername;APP=Microsoft® Access (Pass Through
Query);DATABASE=databasename;Network=DBMSSOCN;ConnectionTimeout=20;
Trusted_Connection=Yes
Run Code Online (Sandbox Code Playgroud)
升级后,我们发现用户无法运行传递查询,并显示以下错误:
ODBC - 与"SQL Server"的连接失败
这最初似乎是一个权限问题,因为将SQL服务器登录的priveledges提升到sysadmin服务器角色缓解了这个问题(但显然这不是一个很好的解决方案).
从登录sysadmin角色后,我们发现当通过Management Studio连接到SQL Server时,登录可以执行存储过程.MS Access中无法进行相同的登录.这指向了MS Access在尝试执行存储过程时所做的事情 - 而不是权限问题.
我们使用Profiler在服务器上运行了一个跟踪,这显示MS Access试图在存储的proc执行之前执行以下命令:
DBCC TRACEON(208)
Run Code Online (Sandbox Code Playgroud)
在存储过程执行之前,它似乎在此命令失败.对Web的研究表明,DBCC TRACEON(208)相当于使用'SET QUOTED IDENTIFIERS ON'命令,并且在SQL 2005中,运行此DBCC命令的priveledges已被撤销.
经过进一步研究,我们发现对MS Query的引用存在类似的问题,并且连接字符串的APP组件应该从"MS Query"更改为其他内容.
在预感中,我们更改了ODBC连接字符串的APP组件,并且MS Access在存储过程执行之前不再尝试执行DBCC TRACEON(208).
经过进一步测试,我们将问题跟踪到APP组件中包含的"版权"符号:
APP=Microsoft® Access (Pass Through Query)
Run Code Online (Sandbox Code Playgroud)
通过删除版权符号,一切都很好的连接和应用程序工作,就像以前在SQL 2000上所做的那样.
希望这可以帮助其他有类似问题的人.
在SQL Server连接字符串中,Integrated Security = True/SSPI和之间有什么区别Persist Security = True?
我有一个ASP.Net MVC应用程序,它在我的本地开发机器上运行良好.但是当部署到IIS7时,在尝试登录时出现以下错误:
初始化字符串的格式不符合从索引0开始的规范
发布此错误的大多数人通过以某种方式更改其连接字符串来解决此问题.但是,本地和已部署应用程序上的连接字符串是相同的.连接字符串是这样的:
<add name="ApplicationServices" connectionString="Data Source=*server*\*instance*;Initial Catalog=*database*;Integrated Security=True;"
providerName="System.Data.SqlClient" />
Run Code Online (Sandbox Code Playgroud)
在我的情况下导致此错误的原因是什么?
我的团队正在开发的应用程序有一个DLL,用于执行所有数据库访问.应用程序无法使用受信任的连接,因为数据库位于防火墙后面而域服务器不在.因此,连接字符串似乎需要具有DB用户名和密码.DLL当前具有硬编码的数据库连接字符串,但我不想在启动时执行此操作,因为可以反汇编程序集,并且用户名和密码将在打开时正确.
其中一个要求是密码需要每隔几个月更改一次,因此我们需要将其转发给我们的内部用户群.
有没有办法以这样的方式存储加密的密码,我们可以轻松地分发给整个用户群而不将其存储在程序集中?
更新:感谢所有回答的人.我将尝试回答一些问题...... ASP.NET WebForms和VB.NET WinForms都使用了数据DLL.我知道应用程序可以拥有自己的配置文件,但我还没有看到任何关于DLL的配置文件.不幸的是,我无法在工作中看到Jon Galloway的帖子,所以我无法判断这是否有效.从开发的角度来看,我们不希望在内部使用Web服务,但可能会在明年的某个时候将它们提供给第三方.我不认为模拟会起作用,因为我们无法通过防火墙对用户进行身份验证.由于用户(或以前的用户)可能是攻击者,我们将其与所有人保持一致!
我目前在Azure中有一个应用程序,每当我们将它推入Staging段时,由于连接字符串指向prod数据库,我们无法真正测试.
有人向我提到,您应该能够在(而非)web.config文件中设置ServiceConfiguration.cscfg文件中的连接字符串.这样,您可以更改Azure门户中的连接字符串,而不是重新发布who app.
有谁知道如何做到这一点?
connection-string web-config azure azure-configuration azure-cloud-services
我目前正在学习这些教程,并且我想从Azure的Web应用程序设置中调用明文字符串.我的印象是环境变量用于非配置文件.但是,我想对web.config文件使用相同的方法.
<connectionStrings configSource="/config/ConnectionStrings.config">
<add name="DefaultConnection" connectionString="@Environment.GetEnvironmentalVariable('SQLAZURECONNSTR_DefaultConnection')" providerName="System.Data.SqlClient" />
</connectionStrings>
<appSettings file="config\AppSettingsSecret.config">
<!-- Code Removed for Conciseness-->
<add key="mailAccount" value="@Environment.GetEnvironmentalVariable('APPSETTING_mailAccount')" />
<add key="mailPassword" value="@Environment.GetEnvironmentalVariable('APPSETTING_mailPassword')" />
<!-- Twilio-->
<add key="TwilioSid" value="@Environment.GetEnvironmentalVariable('APPSETTING_TwilioSid')" />
<add key="TwilioToken" value="@Environment.GetEnvironmentalVariable('APPSETTING_TwilioToken')" />
<add key="TwilioFromPhone" value="@Environment.GetEnvironmentalVariable('APPSETTING_TwilioFromPhone')" />
</appSettings>
Run Code Online (Sandbox Code Playgroud)
注意:我在本地测试中包含了configSource ="/ example /".
从安全角度来看,在Web应用程序中管理连接字符串的最佳方法是什么?我已经采用了几种不同的方式.我将它们存储为纯文本web.config设置键.我还创建了一个"常量"类,它为每个连接字符串提供了公共只读字符串属性.
有没有人有任何关于管理连接字符串的建议,以至于我不会担心它们被恶意发现?我绝对愿意加密.
我在VS2008中创建了一个新项目,并在项目中添加了一个.MDF文件.这是我第一次尝试使用MDF文件和.SQLEXPRESS数据库(过去我一直使用extenal Oracle服务器).
我正在尝试记录所有内容,但我无法弄清楚用于连接.MDF文件的凭据.有一个简单的方法可以找到答案吗?
我有一个ELMAH问题.我认为这是连接字符串,但无法弄清楚原因.它通过电子邮件发送给我错误没问题,只是没有将它们记录到sql中.如果问题是权限,我如何捕获错误以向我显示其权限问题?以下是我的web.config的elmah相关部分:
<configSections>
<sectionGroup name="elmah">
<section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" />
<section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" />
<section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" />
<section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" />
<section name="errorTweet" requirePermission="false" type="Elmah.ErrorTweetSectionHandler, Elmah" />
</sectionGroup>
Run Code Online (Sandbox Code Playgroud)
<connectionStrings>
<add name="ErrorLog" connectionString="Data Source=SQL1;Initial Catalog=ASBESTOS;User Id=MyUserName;Password=MyPassword" providerName="System.Data.SqlClient" />
Run Code Online (Sandbox Code Playgroud)
<system.web>
<httpModules>
<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
<add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
<add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" />
</httpModules>
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
<add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" />
<add name="ErrorFilter" …Run Code Online (Sandbox Code Playgroud) sql-server ×3
web-config ×3
.net ×2
asp.net ×2
azure ×2
appsettings ×1
asp.net-mvc ×1
database ×1
dbcc ×1
deployment ×1
elmah ×1
iis-7 ×1
mdf ×1
ms-access ×1
odbc ×1
sql ×1