Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF服务返回数据集_C#_Wcf_Datagridview_Dataset_Odbc - Fatal编程技术网

C# WCF服务返回数据集

C# WCF服务返回数据集,c#,wcf,datagridview,dataset,odbc,C#,Wcf,Datagridview,Dataset,Odbc,我有这个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

我有这个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服务返回
数据集
是一种糟糕的做法,我有一个桌面应用程序,我需要用服务的结果填充
DataGridView

private void ButtonInfo_Click(object sender, EventArgs e)
{ 
     WCFService service = new WCFService();
     DataGridView1.DataSource = service.GetInfo();
     service.Close();
}
要正确填写
DataGridView
,我应该从WCF服务中获取什么样的数据类型


提前感谢。

更好的方法是返回(在您的情况下,将收集DTO)

首先,创建DTO类,该类将包含Products表中的预期字段。例如:

public class Product
{
    public string Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}
接下来,通过以下方式从数据库读取值:

//使用IEnumerable for.net=4.5
公共IReadOnlyCollection GetInfo()
{
OdbcCommand=新OdbcCommand(“从产品中选择*,其中id='JBE-235',OdbcConn”);
OdbcConn.Open();
var reader=command.ExecuteReader();
var products=新列表();
while(reader.Read())
{
var product=新产品();
//reader index是查询中的列名
//您还可以使用列索引,例如reader.GetString(0)
product.Id=(字符串)读取器[“Id”];
product.Name=(字符串)读取器[“Name”];
product.Price=(十进制)读卡器[“Price”];
产品。添加(产品);
}
退货产品;
}
请注意,您需要在读取所有数据后关闭连接,然后最好使用using语句在方法末尾自动处理它。另一个建议是使用以下命令:

//使用IEnumerable for.net=4.5
公共IReadOnlyCollection GetInfo()
{
使用(var con=GetConnection())
{
var cmd=new OdbcCommand(“从产品中选择*,其中id=@id”,con);
cmd.Parameters.AddWithValue(“@Id”,“JBE-235”);
con.Open();
var reader=cmd.ExecuteReader();
var products=新列表();
while(reader.Read())
{
Add(新产品{Id=(string)读卡器[“Id”],Name=(string)读卡器[“Name”],Price=(十进制)读卡器[“Price”]});
}
退货产品;
}
}

我建议您返回产品类型的对象列表。创建类Product,它将保存表Products中的属性,然后返回列表。当然,您必须首先通过数据集(或者使用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;
}
// 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;
    }
}