在C#和SQL Server中使用嵌套
此线程是 我注意到resharper允许我定义using,而无需像下面的方法那样打开任何打开/关闭括号(但是,如果括号不存在,我以后就不能使用定义的变量,除了在defined using下面使用的变量之外): 好吗?或者我应该这样使用它在C#和SQL Server中使用嵌套,c#,sql,sql-server-2005,sql-server-2008,multithreading,C#,Sql,Sql Server 2005,Sql Server 2008,Multithreading,此线程是 我注意到resharper允许我定义using,而无需像下面的方法那样打开任何打开/关闭括号(但是,如果括号不存在,我以后就不能使用定义的变量,除了在defined using下面使用的变量之外): 好吗?或者我应该这样使用它 public static string sqlGetDatabaseRows() { string varRows = ""; const string preparedCommand = @"
public static string sqlGetDatabaseRows() {
string varRows = "";
const string preparedCommand = @"
SELECT SUM(row_count) AS 'Rows'
FROM sys.dm_db_partition_stats
WHERE index_id IN (0,1)
AND OBJECTPROPERTY([object_id], 'IsMsShipped') = 0;";
using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetailsDZP)) {
using (var sqlQuery = new SqlCommand(preparedCommand, varConnection))
using (var sqlQueryResult = sqlQuery.ExecuteReader())
if (sqlQueryResult != null) {
while (sqlQueryResult.Read()) {
varRows = sqlQueryResult["Rows"].ToString();
}
sqlQueryResult.Close();
}
varConnection.Close();
}
return varRows;
}
sqlConnectOneTime如下所示:
public static SqlConnection sqlConnectOneTime(string varSqlConnectionDetails) {
SqlConnection sqlConnection = new SqlConnection(varSqlConnectionDetails);
sqlConnect(sqlConnection);
if (sqlConnection.State == ConnectionState.Open) {
return sqlConnection;
}
return null;
}
我的问题是:
编辑:如果使用using,则必须修改varConnection.Close()和sqlQueryResult.Close()是否正确的问题。像第一个示例中那样使用它是安全的
using
关闭读卡器、命令和连接对象,甚至检查null
值(如果varConnection
为null
,则不会出现null引用异常
)
另外,另一个风格注释——我建议正确地使用语句,以防添加了多余的行,并出现意外错误。就风格而言,当我有多个语句在一起时,我通常不倾向于使用语句缩进,但这完全取决于个人偏好。如果这些变量中的任何一个为空,该怎么办?如果varConnection为null,它将返回并且不执行第一个、第二个变量中的内容。我所说的null检查是指在调用Dispose之前,它检查变量是否为null。因此,在将其传递给其他方法之前,您仍然必须检查
varConnection
是否为null。但是,我建议不要从sqlConnectOneTime
方法返回空值,而是抛出异常。问题是,我是唯一创建此应用程序的人,因此没有其他人会调用它:-)同时抛出异常也不是个好主意,因为它会混淆用户。我想最好的选择是保持安静,这样如果查询没有执行,用户就不会得到任何信息,所以他/她只需重试。最后,我想我可以添加一些消息框,说明如果他/她想再试一次,连接无法建立?您认为这是最好的方法吗?我当然不认为您应该直接向用户公开异常。但是,这不应该是连接调用的问题。它的特征相当清晰——它负责创建连接。如果它不能执行这个任务,那么抛出一个异常是合理的(并且调用代码能够捕获这个异常并适当地处理它)。通过返回null,您将返回一个意外值,更糟糕的是,没有提供有关此连接失败原因的任何信息。通过抛出异常,可以解决这两个问题。
public static SqlConnection sqlConnectOneTime(string varSqlConnectionDetails) {
SqlConnection sqlConnection = new SqlConnection(varSqlConnectionDetails);
sqlConnect(sqlConnection);
if (sqlConnection.State == ConnectionState.Open) {
return sqlConnection;
}
return null;
}