簡體   English   中英

WCF服務返回DataSet

[英]WCF service returning DataSet

我有這個WCF服務:

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;
}

但我已經讀過從WCF服務返回DataSet是一種不好的做法,我有一個桌面應用程序,我需要用服務的結果填充DataGridView

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

我應該從WCF服務獲取什么樣的數據類型才能正確填充DataGridView

提前致謝。

更好的方法是返回DTO (在您的情況下,它將是DTO的集合)。

首先,創建將包含Products表中的預期字段的DTO類。 例如:

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;
}

請注意,您需要在讀取所有數據后關閉連接,然后好的做法是使用using語句自動將其置於方法的末尾。 另一個建議是使用命令參數

// 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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM