Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#中的SqlConnection——安全编程实践_C#_.net - Fatal编程技术网

C#中的SqlConnection——安全编程实践

C#中的SqlConnection——安全编程实践,c#,.net,C#,.net,我在MSDN网站上找到了以下代码: 我的问题是。。。该网站还注意到,.Open()可以抛出InvalidOperationExceptions和SqlExceptions,但是这个例子看起来并没有处理它们 这仅仅是因为他们的代码很简短,还是有一个不值得在这里处理的原因?它们是否可能由using构造以某种方式处理?这取决于在捕获这些异常时您是否可以“做”任何事情 如果不是-通常认为的最佳实践是让异常在堆栈中冒泡,直到它们达到可以以有意义的方式处理的程度(对于web应用程序,这可能只是记录一个500

我在MSDN网站上找到了以下代码:

我的问题是。。。该网站还注意到,
.Open()
可以抛出InvalidOperationExceptions和SqlExceptions,但是这个例子看起来并没有处理它们


这仅仅是因为他们的代码很简短,还是有一个不值得在这里处理的原因?它们是否可能由using构造以某种方式处理?

这取决于在捕获这些异常时您是否可以“做”任何事情


如果不是-通常认为的最佳实践是让异常在堆栈中冒泡,直到它们达到可以以有意义的方式处理的程度(对于web应用程序,这可能只是记录一个500错误)

编写MSDN示例是为了提供一个易于阅读的示例,而不是传授最佳实践。这就是为什么人们不应该在不理解代码的情况下复制/粘贴代码的原因之一

每MSDN

using语句调用中对象的Dispose方法 正确的方式,并且(当您如前所示使用它时),它也会导致 对象本身在调用Dispose后立即超出范围


它将关闭打开的连接(通过使用finally)。它不会捕获正在抛出的异常。它通过将所附语句包装在try/finally中来实现。没有捕获。

这些案件正在处理中

using
语句被转换为适当的dispose模式,该模式在异常情况下也会处理处置

在这种情况下,即使抛出异常,连接也将被释放

例外情况本身会出现泡沫

有关详细信息,请参阅MSDN上的

这仅仅是因为他们对代码很简短,还是有 他们不值得在这里处理的原因?他们可能是被警察抓到的吗 以某种方式使用构造


using
关键字是
try/finally
的语法糖,即使您引用的代码不会处理可能的异常,SQL连接也会被正确处理。他们可能没有显式地处理可能的异常,因为许多人更喜欢让异常冒泡到最高层并在那里处理异常

using语句确保即使在调用对象上的方法时发生异常,也会调用Dispose。Try/catch代价高昂。try/catch会影响编译器优化,以及程序员会使用try/catch而不是检查null这样简单的操作。这只是坏习惯。捕获异常总是比执行简单检查慢。我不是说要使用它们,而是不要用它们来代替防御编程

另外,查看代码,只有在存在有效连接的情况下才会调用“open”命令。所以不用担心

“使用”与将对象放入try块中,然后在finally块中调用Dispose相同


如果您仍然需要处理任何特定的异常,请包括try..catch..

此示例令人困惑,但在技术上是正确的。 在实际应用程序中,此示例“按原样”没有任何价值。
它们甚至不会将SqlConnection返回到调用代码。
所以,正如你所说,“他们的代码很简短”

在现实世界中,您可以使用这样的方法

private static SqlConnection OpenSqlConnection(string connectionString) 
{ 
    SqlConnection connection = new SqlConnection(connectionString)
    connection.Open(); 
    return connection;    
} 
然后在您的代码中使用它(尽管没有多少好处)

当然,using语句隐藏了捕获异常和关闭/处理所有内容的所有工作,因此,从技术上讲,异常是被处理的,但实际上,如果某些操作失败,您不会得到任何线索

using (SqlConnection connection = new SqlConnection(connectionString))
    {

    }
相当于

try
{

    SqlConnection connection = new SqlConnection(connectionString)
}
finally
{
   connection.Dispose();
}
“using”只是为了确保调用对象上的dispose()方法(在本例中是为了确保连接返回到连接池)。“使用”并不是为了取代捕获物


在我所从事的项目中,通常我们最后会进行很多尝试。Catch仅在最高级别用于记录它。不应使用catch重新抛出错误(与记录错误相反)的一个原因是catch非常占用资源。

.Open()
将在连接字符串无效、
SqlConnection
对象为null或空,或者无法连接到服务器(或本地数据库)时抛出异常。在这种情况下,他们假设连接字符串是有效的,并且using语句确保连接不是空的。你能给我解释一下吗,或者给我一个我能读到的链接吗?他们没有被处理。@KendallFrey-不管有什么异常,处理的案例都会被处理。重新措辞的回答。谢谢大家,这让问题清楚了很多。我来自C++ BrgRund,所以我喜欢仔细检查其中的一些东西,以确保它们没有做比我想象的要多的事情:)- 1:<代码>使用< /Cord>没有阻止应用程序崩溃的意思。“你没有任何线索”是什么意思?你会得到一个例外,这是一个非常大的“线索”。@JohnSaunders我在想这个。如果
using
类似于try/finally块,那么如果using块内部出现异常会发生什么?它会在区块外冒出气泡,我们可以注意到,还是会被最后一个被关闭的大括号遮住的“吃掉”?刚刚发现,现在阅读以更好地理解
使用
就像
尝试/finally
,而不是
尝试/Catch
。它不吃异常,因为它不捕捉它们。在示例代码中执行最佳实践的部分问题在于,新手很难弄清楚到底发生了什么。
using (SqlConnection connection = new SqlConnection(connectionString))
    {

    }
try
{

    SqlConnection connection = new SqlConnection(connectionString)
}
finally
{
   connection.Dispose();
}