gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:56:32 25 4
gpt4 key购买 nike

我创建了一个从表中获取数据的方法,但它给了我标题中所述的错误。在发帖之前,我已经从包括 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com