Как использовать Datareader внутри класса с использованием C # - PullRequest
1 голос
/ 16 сентября 2011

У меня есть SqlDataReader, который сидел в коде страницы позади (ну, на самом деле, пользовательский веб-элемент управления). Я хотел бы переместить этот код в отдельный класс, который вызывает пользовательский элемент управления. Но как мне связать данные из класса с ретранслятором на странице?

Это приемлемая концепция?

Вот мой код, перемещенный в класс:

public class ShoppingCart
{
    public ShoppingCart(int ShoppingCartHeadID)
    {
        SqlConnection conn;
        SqlCommand comm;
        SqlDataReader reader;

        conn = new SqlConnection(iceConns.iconn);

        comm = new SqlCommand("Ordering.sl_ShoppingCartContents", conn);
        comm.CommandType = CommandType.StoredProcedure;
        comm.Parameters.Add(new SqlParameter("@shoppingCartHeadID", SqlDbType.Int));
        comm.Parameters["@shoppingCartHeadID"].Value = ShoppingCartHeadID;

        try
        {
            conn.Open();
            reader = comm.ExecuteReader();
            Cart.DataSource = reader; //This ain't gonna work!
            if (reader.HasRows)
            {
                Cart.DataBind(); //This ain't gonna work!
                varCartStatus = true;
            }
            reader.Close();
        }
        catch
        {
            //Error trapping
        }
        finally
        {
            conn.Close();
        }
    }
}

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

5 голосов
/ 16 сентября 2011

Вы должны создать объект сущности для возвращаемых данных.Затем вы можете привязать любой элемент управления к списку созданного вами объекта.

Создайте объект Cart со свойствами, сопоставленными с вашей таблицей базы данных.Затем создайте класс наподобие CartRepository, у которого будет метод GetCartById (CartId).Этот метод сделает вышеописанную работу, но вместо того, чтобы пытаться связать что-либо здесь, вы просто будете заполнять объекты корзины.Возвращает список этих объектов, и вы можете связать этот список с любым элементом управления.

public class Cart
{
    //Properties from cart - Just using name as an example.
    public string name { get; set; }
}

public class CartRepository
{
    public List<Cart> GetById(int cartId)
    {
        List<Cart> carts = new List<Cart>();

        // Do all sql work including setting up connection, command, ect.

        while(reader.read())
        {
            // Map your reader to your cart object.
            Cart c = new Cart();
            c.name = reader["name"].ToString();
            carts.add(c);
        }

        return carts;
    }
}

Теперь из вашего кода просто привяжите свой элемент управления к списку, возвращенному из объекта репозитория.

 myControl1.DataSource = CartRepository.GetById(cartId);
1 голос
/ 16 сентября 2011

«Современный» способ состоит в том, чтобы связать ваш Repeater с коллекцией, такой как общий список List<T>, вероятно, List<Order>, возвращаемый вашим классом ShoppingCart, например, с помощью метода GetOrders(int customerId) или аналогичного.

Таким образом, ваша процедура доступа к данным заполнит список:

List<Orders> lst = new List<Orders>();  

while (rdr.Read()){
    Order o = new Order( <populate from the reader's fields e.g. rdr["OrderId"] (remember to cast accordingly) ...);  
    lst.Add(o);    

}

...

И затем, на своей веб-странице / элементе управления вы делаете что-то вроде

Cart.DataSource = ShoppingCart.GetOrders(...);
Cart.DataBind();

Вам понадобятся свойства get / set в вашем пользовательском классе Order, чтобы упростить привязку данных.

НТН. Вот пример v. Basic demo application, если вы хотите увидеть это в действии: http://www.largedocument.com/1/ec24da47/BindingToCollectionsDemo.zip

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...