Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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#和SQL Server中使用嵌套_C#_Sql_Sql Server 2005_Sql Server 2008_Multithreading - Fatal编程技术网

在C#和SQL Server中使用嵌套

在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 = @"

此线程是

我注意到resharper允许我定义using,而无需像下面的方法那样打开任何打开/关闭括号(但是,如果括号不存在,我以后就不能使用定义的变量,除了在defined using下面使用的变量之外):

好吗?或者我应该这样使用它

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;
    }
我的问题是:

  • 我应该使用varConnection.Close()和sqlQueryResult.Close()关闭varConnection吗;最后(但这会强制使用括号)或者在使用完毕后连接会自动关闭

  • 我是否应该为varConnection检查NULL,因为它可能会返回NULL(另一方面,resharper不会在这里抱怨)

  • 有没有更好的方法可以用来定义sqlConnectOneTime?就像当连接无法打开时,它应该返回ConnectionState.Closed而不是null

  • 还有一点值得注意的是,我每次执行新的查询/更新/插入时都会打开新的连接,因为我使用线程,这是当时我能想到的最聪明的想法。请随意提出更好的建议:-)

    我问这一切,因为我想更好地了解整个过程,停止犯愚蠢的错误,所以对我要温柔

    疯子


    编辑:如果使用using,则必须修改varConnection.Close()和sqlQueryResult.Close()是否正确的问题。

    像第一个示例中那样使用它是安全的
    using
    关闭读卡器、命令和连接对象,甚至检查
    null
    值(如果
    varConnection
    null
    ,则不会出现
    null引用异常

  • Close()由Dispose()方法调用,因此只要正确使用“use”,就不需要显式调用Close()
  • 如果有可能返回NULL,您应该检查它。我建议,如果您控制获得SQL连接的代码,则强烈考虑抛出异常而不是返回null。否则,其他开发人员可能会遇到同样的问题。在我看来,无法打开所需的SQL连接是一种有效的例外情况。如有必要,当开发人员希望避免异常处理时,您可以始终包括TryConnectOneTime

  • 另外,另一个风格注释——我建议正确地使用语句,以防添加了多余的行,并出现意外错误。就风格而言,当我有多个语句在一起时,我通常不倾向于使用语句缩进,但这完全取决于个人偏好。

    如果这些变量中的任何一个为空,该怎么办?如果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;
        }