using (SqlConnection connection = new SqlConnection(connectionString))

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了using (SqlConnection connection = new SqlConnection(connectionString))相关的知识,希望对你有一定的参考价值。

为什么有些人在用这个的时候要加using,这是什么意思?

using专业名词叫作用域,顾名思义,就是using中声明的变量只在using中有效,这样可以避免有时忘了释放一些必须释放的资源所引起的异常. 参考技术A 一般情况我们会这样写 connection.Dispose()来释放资源
而使用using 就是定义一个范围,在这个范围结束的时候自动调用Dispose方法来释放资源
其他如文件操作也是同样的道理
直接调用Dispose方法,和使用using是等效的,但是使用using代码更加的优雅一点
参考技术B 呵呵,他有两种用法,一个是引用,using System…另一个是你这个,他是用来释放资源的,有了这个,就不用con.close()了,自动释放资源,---纯手机打!

SqlConnection() 无参数异常

【中文标题】SqlConnection() 无参数异常【英文标题】:SqlConnection() parameterless exception 【发布时间】:2019-02-08 07:52:52 【问题描述】:

我在尝试初始化 SqlConnection 实例时遇到此错误。

首先我尝试使用 ConnectionString 参数,现在我看到它即使在构造函数中没有它也会发生。该代码曾经可以工作,但在我更换PC后失败,所以我想它与Windows设置(Windows 7)或用户权限有关 我的代码:

using (SqlConnection conn = new SqlConnection())

   SqlConnectionStringBuilder builder = 
   new SqlConnectionStringBuilder("Server=server1;Integrated Security=SSPI;Initial Catalog=db1");
   conn.ConnectionString = builder.ConnectionString;

我已经尝试过按照一些人的建议来回切换目标框架但没有结果(目前使用 4.5.2)

更新

使用行抛出的异常:

System.TypeInitializationException 发生 HResult=0x80131534 Message='System.Data.SqlClient.SqlConnection' 的类型初始化器 抛出异常。来源= StackTrace:在 System.Data.SqlClient.SqlConnection..ctor() 处 Reg_CB_Report.Program.GetSql(String ExecText) 在 H:\MY\code\c#\Reg_CB_Report\Reg_CB_Report\Program.cs:第 228 行 Reg_CB_Report.Program.Main(String[] args) 在 H:\MY\code\c#\Reg_CB_Report\Reg_CB_Report\Program.cs:第 83 行

内部异常1:ArgumentException:参数不正确。 (来自 HRESULT 的异常:0x80070057 (E_INVALIDARG))

更新2

App.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/>
    </startup>
</configuration>

尝试重新创建它 - 没有结果

堆栈跟踪:

StackTrace " 在 System.Security.Policy.PEFileEvidenceFactory.GetLocationEvidence(SafePEFileHandle peFile, SecurityZone& zone, StringHandleOnStack retUrl)\r\n 在 System.Security.Policy.PEFileEvidenceFactory.GenerateLocationEvidence()\r\n 在 System.Security。 Policy.PEFileEvidenceFactory.GenerateEvidence(Type evidenceType)\r\n at System.Security.Policy.AssemblyEvidenceFactory.GenerateEvidence(Type evidenceType)\r\n at System.Security.Policy.Evidence.GetHostEvidenceNoLock(Type type)\r\n at System.Security.Policy.Evidence.GetHostEvidence(Type type, Boolean markDelayEvaluatedEvidenceUsed)\r\n 在 System.Security.Policy.AppDomainEvidenceFactory.GenerateEvidence(Type evidenceType)\r\n 在 System.Security.Policy.Evidence.GetHostEvidenceNoLock(Type类型)\r\n 在 System.Security.Policy.Evidence.RawEvidenceEnumerator.MoveNext()\r\n 在 System.Security.Policy.Evidence.EvidenceEnumerator.MoveNext()\r\n 在 System.Configuration.ClientConfigPaths.GetEvidenceInfo (AppDomain appDoma in, String exePath, String& typeName)\r\n at System.Configuration.ClientConfigPaths.GetTypeAndHashSuffix(AppDomain appDomain, String exePath)\r\n at System.Configuration.ClientConfigPaths..ctor(String exePath, Boolean includeUserConfig)\r\ n 在 System.Configuration.ClientConfigPaths.GetPaths(String exePath, Boolean includeUserConfig)\r\n 在 System.Configuration.ClientConfigurationHost.RequireCompleteInit(IInternalConfigRecord 记录)\r\n 在 System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg , Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)\r\n 在 System.Configuration.BaseConfigurationRecord.GetSection(String configKey)\r\n 在 System.Data.SqlClient.SqlConnection..cctor()"字符串

【问题讨论】:

异常的信息是什么? 它的类型初始化器doesn't really do much,但它确实尝试访问配置。你会认为足够损坏的配置会完全停止你的程序,但也许值得查看你的配置,看看那里是否有任何可疑之处。 @Damien_The_Unbeliever 我根本没有使用它,所以它只有一个带有框架版本的标签,已经尝试删除它并重新创建 内部异常是否有堆栈跟踪以及消息? 为什么要在连接字符串之前创建连接对象?其实在不修改初始连接字符串的情况下,为什么还要使用SqlConnectionStringBuilder呢? 【参考方案1】:

您似乎正在尝试在最旧的受支持运行时上使用最新版本的 SqlClient NuGet 包 (4.6)。也可能涉及缺少的安全更新。

异常中提到的类型初始化器是static constructor,它试图加载SqlColumnEncryptionEnclaveProviders 配置部分。我也从未遇到过该部分。

一种选择是返回到早期可用的 SqlClient 包。另一种选择是目标 .NET 4.7.2 及更高版本。最后,您可以自己添加缺少的部分,如指向 SharePoint 错误的链接所示:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <configSections>
       <section name="SqlColumnEncryptionEnclaveProviders" 
         type="System.Data.SqlClient.SqlColumnEncryptionEnclaveProviderConfigurationSection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
    </configSections>
</configuration>

这不是 SqlClient 4.6 引入的唯一错误。还有一个,同样涉及无参数构造函数。

【讨论】:

它工作了,但不是直接,错误转移到 conn.Open(),我安装了最旧的 nuget,实际上尝试了所有方法,但重启后它开始工作

以上是关于using (SqlConnection connection = new SqlConnection(connectionString))的主要内容,如果未能解决你的问题,请参考以下文章

判断SqlConnection连接是否关闭

如何使用 SqlConnection.GetSchema 获取同义词信息?

using (SqlConnection connection = new SqlConnection(connectionString))

using(SqlConnection connection=new SqlConnection(connectionString))

SqlConnection.Close() 在 using 语句中

c#啥时候有必要用using(代码段)?