c# - 阅读器关闭时调用 Read 的尝试无效。 (C#)

标签 c# sql sql-server

我创建了一个从表中获取数据的方法,但它给了我标题中所述的错误。在发帖之前,我已经从包括 stackoverflow 在内的各种网站阅读了很多方法,但它对我没有帮助。

下面是我的方法。

    public SqlDataReader GetCustomer()
    {
        SqlDataReader reader = null;
        _conn = new SqlConnection(connString);
        string sqlQuery = @"SELECT CustName, CustNationality FROM Customer";
        using (_conn)
        {
            using (SqlCommand cmd = new SqlCommand(sqlQuery, _conn))
            {
                _conn.Open();
                reader = cmd.ExecuteReader();
                _conn.Close();
            }
        }
        return reader;
    }

我正在调用该方法;

        SqlDataReader reader = null;
        cmboBoxClient.Items.Add("");
        reader = connect.GetCustomer() as SqlDataReader;
        while (reader.Read())
        {
            cmboBoxClient.Items.Add(reader["CustName"] + " " + reader["CustNationality"]);
        }

但给我错误,我尝试了 IEnumerable 方法,但随后它给了我转换/转换错误。即 IDataReader 到 SqlDataReader。 后来我读到这种方法是不可能的。

请给我建议。

最佳答案

您将在返回阅读器之前关闭连接。在使用数据库游标时,您应该保持连接打开。因此,返回阅读器不是最佳选择,因为您无法在调用者使用连接时处理连接。我建议你创建强类型类 Customer

public class Customer
{
    public string Name { get; set; }
    public string Nationality { get; set; }
}

并在您的 GetCustomers 方法中填写客户列表(是的,您的查询返回许多客户,而不是单个客户):

public IEnumerable<Customer> GetCustomers()
{
    string sqlQuery = @"SELECT CustName, CustNationality FROM Customer";

    using (var conn = new SqlConnection(connString))        
    using (SqlCommand cmd = new SqlCommand(sqlQuery, conn))
    {
        conn.Open();
        var reader = cmd.ExecuteReader();

        while(reader.Read())
        {
            yield return new Customer {
                Name = (string)reader["CustName"],
                Nationality = (string)reader["CustNationality"]
            };
        }
    }
}

这将允许您在枚举结束时自动关闭连接,并使调用者代码远离数据库详细信息:

cmboBoxClient.Items.Add("");

foreach(var customer in connect.GetCustomers())
    cmboBoxClient.Items.Add(String.Format("{0} {1}",customer.Name, customer.Nationality));

顺便说一句 Dapper可以为你做所有的查询和映射。这样代码看起来像

public IEnumerable<Customer> GetCustomers()
{
    using (var conn = new SqlConnection(connString))
    {                
        conn.Open();
        return conn.Query<Customer>("SELECT CustName, CustNationality FROM Customer");
    }
}

是的,这就是您所需要的。

关于c# - 阅读器关闭时调用 Read 的尝试无效。 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33157744/

相关文章:

sql-server - 编辑结果网格中的数据

c# - 在 Unity 中一般根据分数分配正确的 Sprite

PHP函数查找MySQL中列的中位数

MySQL:从组中选择最后一个,但有条件

sql - 如何将 .sql 文件转换为 SAS 数据集?

sql - 生成唯一的批处理 ID (SQL Server)

c# - linq ASP.NET MVC 存储库模式的最佳实践是什么

c# - 需要有关代码 c# 的帮助

c# - 创建类实例时关键字 "new"和 "default"不同

mysql - SQL - 查找键等于值的所有 "Relationship IDs",然后选择包含这些 "Relationship IDs"的所有记录