如何在asp.net中关闭executereader?

时间:2011-05-11 17:07:26

标签: asp.net visual-studio

我在同一页面上使用了多个转发器。但是,当我使用Execute reader for 2nd repeater时,它会让已经执行的读取器运行的异常...所以关闭它。我把ExecuteReader(CommandBehavior.CloseConnection)但是它给出了命令行为不存在的错误...对这个问题有任何想法吗?

2 个答案:

答案 0 :(得分:1)

如果您指定DataReader,则需要明确关闭CommandBehavior,但不会为您执行此操作。

http://msdn.microsoft.com/en-us/library/y6wy5a0f.aspx

答案 1 :(得分:1)

我个人会将UI控件绑定到强类型对象。例如,我将定义一个产品模型:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
}

然后是从数据库中读取产品的方法:

public static IEnumerable<Product> GetProducts()
{
    using (var conn = new SqlConnection("Some connection string"))
    using (var cmd = conn.CreateCommand())
    {
        conn.Open();
        cmd.CommandText = "SELECT prod_id, prod_name FROM products";
        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                yield return new Product
                {
                    Id = reader.GetInt32(reader.GetOrdinal("prod_id")),
                    Name = reader.GetString(reader.GetOrdinal("prod_name")),
                };
            }
        }
    }
}

在Web层我会调用此方法来获取我的产品并将它们绑定到一些UI控件:

protected void Page_Load(object sender, EventArgs e)
{
    var products = Db.GetProducts().ToArray();

    repeater1.DataSource = products;
    repeater2.DataSource = products;
    gridView.DataSource = products;
    ...
}

当您厌倦编写这些SQL查询时,您可能会看一下ORM,例如Entity Framework