已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭。

已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭。
代码如下:

        static void Main(string[] args)
        {
            SqlConnectionStringBuilder connectionStringBuilder = new SqlConnectionStringBuilder();
            connectionStringBuilder.InitialCatalog = "DWYS";
            connectionStringBuilder.DataSource = "127.0.0.1";
            connectionStringBuilder.UserID = "sa";
            connectionStringBuilder.Password = "meirenai.";
            connectionStringBuilder.MultipleActiveResultSets = true;
            SqlConnection sqlConnection = new SqlConnection(connectionStringBuilder.ToString());
            sqlConnection.Open();

            SqlCommand cmd = new SqlCommand("SELECT [username],[password] FROM [dbo].[user]", sqlConnection);
            SqlDataReader sqlDataReader = cmd.ExecuteReader();
            Console.WriteLine(cmd.ExecuteNonQuery());
            sqlConnection.Close();
        }

求解答

正常情况我们建议新人使用 DataTable,而不是dataReader
虽然某个园子会告诉你们用reader好,不过飙车这种事情,还是等能正常上路了在说。

你这里差个sqlDataReader.close(),虽然就一句话差别。但是就像飙车一样,多踩一脚油门就需要有多踩一脚油门的处理技术

你这代码暂时只是个异常,不过很多入门的新人会在下面在写个循环套循环,N个循环就有N个reader,conn还都是open的。
这样连接池有多少个都不够你用的,一个普通功能20个人并发访问就挂了

【以下回答由 GPT 生成】

根据问题的描述和提供的代码,这是一个使用 C# 语言连接数据库并执行查询的问题。问题的提示是 "已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭。",说明在执行 ExecuteNonQuery() 方法之前需要关闭 SqlDataReader 对象。下面是解决该问题的步骤和代码:

static void Main(string[] args)
{
    SqlConnectionStringBuilder connectionStringBuilder = new SqlConnectionStringBuilder();
    connectionStringBuilder.InitialCatalog = "DWYS";
    connectionStringBuilder.DataSource = "127.0.0.1";
    connectionStringBuilder.UserID = "sa";
    connectionStringBuilder.Password = "meirenai.";
    connectionStringBuilder.MultipleActiveResultSets = true;

    using (SqlConnection sqlConnection = new SqlConnection(connectionStringBuilder.ToString()))
    {
        sqlConnection.Open();

        using (SqlCommand cmd = new SqlCommand("SELECT [username],[password] FROM [dbo].[user]", sqlConnection))
        {
            using (SqlDataReader sqlDataReader = cmd.ExecuteReader())
            {
                while (sqlDataReader.Read())
                {
                    // 读取数据行的username和password列
                    string username = sqlDataReader["username"].ToString();
                    string password = sqlDataReader["password"].ToString();
                    Console.WriteLine($"Username: {username}, Password: {password}");
                }
            }
        }
    }
}

解决该问题的方法是使用 using 语句来管理对象的生命周期,并在使用完后自动释放资源。在上面的代码中,使用了三个 using 语句分别管理 SqlConnection、SqlCommand 和 SqlDataReader 对象。在这种情况下,当代码块结束时,这些对象会自动关闭和释放资源,同时也会关闭与之关联的 DataReader 对象。

另外,使用 ExecuteNonQuery() 方法执行查询是错误的,该方法用于执行不返回结果集的 SQL 语句(如 INSERT、UPDATE 或 DELETE)。对于 SELECT 查询,应该使用 ExecuteReader() 方法来获取结果集。在上面的代码中,使用了 Read() 方法来逐行读取结果集中的数据,并输出到控制台。

希望以上解答对你有帮助。如果还有任何问题,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^