2016-01-03 3 views
1

У меня есть этот WCF сервис:службы WCF возвращения DataSet

public DataSet GetInfo() 
{ 
     DataTable dt = new DataTable("Tbl"); 
     DataSet ds = new DataSet("Set");   
     OdbcCommand OdbcCmd; 
     OdbcCmd = new OdbcCommand("select * FROM Products where id = 'JBE-235'", OdbcConn);   
     OdbcConn.Open(); 
     dt.Load(OdbcCmd.ExecuteReader()); 
     ds.Tables.Add(dt);   
     OdbcConn.Close();   
     return ds; 
} 

Но я читал, что возвращающая DataSet из службы WCF плохая практика, у меня есть приложение на рабочем столе, и мне нужно, чтобы заполнить DataGridView с результатом службы.

private void ButtonInfo_Click(object sender, EventArgs e) 
{ 
    WCFService service = new WCFService(); 
    DataGridView1.DataSource = service.GetInfo(); 
    service.Close(); 
} 

Какой тип данных я должен получить от службы WCF, чтобы правильно заполнить DataGridView?

Заранее спасибо.

+0

Предлагаю вам вернуть список объектов типа продукта. Создайте класс Продукт, который будет хранить свойства из таблицы Продукты, а затем возвращает Список . Конечно, вам нужно перебирать через набор данных (или использовать datareader, который является моим предпочтительным методом) и сначала заполнить список в вашем методе – Tomislav

ответ

3

Лучший способ - вернуть DTO (в вашем случае это будет коллекция DTO).

Сначала создайте класс DTO, который будет содержать ожидаемые поля из таблицы Products. Например:

public class Product 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public decimal Price { get; set; } 
} 

Далее, считывать значения из базы данных с помощью DataReader:

// use IEnumerable<Product> for .net <= 4.0 and IReadOnlyCollection<Product> for .net >= 4.5 
public IReadOnlyCollection<Product> GetInfo() 
{ 
    OdbcCommand command = new OdbcCommand("select * FROM Products where id = 'JBE-235'", OdbcConn);   
    OdbcConn.Open(); 
    var reader = command.ExecuteReader(); 
    var products = new List<Product>(); 
    while (reader.Read()) 
    { 
     var product = new Product(); 
     // reader index is the column name from query 
     // You can also use column index, for example reader.GetString(0) 
     product.Id = (string) reader["id"]; 
     product.Name = (string) reader["name"]; 
     product.Price = (decimal) reader["price"]; 
     products.Add(product); 
    } 
    return products; 
} 

Обратите внимание, что вам нужно, чтобы закрыть соединение после прочтения всех данных, то эффективная практика заключается в использовании с помощью заявления распоряжаться его в конце вашего метода автоматически. Другим советом является использование команды Parameters:

// use IEnumerable<Product> for .net <= 4.0 and IReadOnlyCollection<Product> for .net >= 4.5 
public IReadOnlyCollection<Product> GetInfo() 
{ 
    using(var con = GetConnection()) 
    { 
     var cmd = new OdbcCommand("select * FROM Products where id = @Id", con); 
     cmd.Parameters.AddWithValue("@Id", "JBE-235"); 
     con.Open(); 
     var reader = cmd.ExecuteReader(); 
     var products = new List<Product>(); 
     while (reader.Read()) 
     { 
      products.Add(new Product { Id = (string) reader["id"], Name = (string) reader["name"], Price = (decimal) reader["price"] }); 
     } 
     return products; 
    } 
} 
Смежные вопросы