WCF中的错误无法将方法组“getAllEmpName”转换为非委托类型“object”。你打算调用这个方法吗?

时间:2012-03-10 12:34:44

标签: wcf gridview datatable dataset

我是WCF的新手。我做了一个如下的应用程序

我的服务如下

void IService1.getAllEmpName()
    {
        SqlConnection con = new SqlConnection("Data Source=SYSTEM19\\SQLEXPRESS;Initial Catalog=Dora;Integrated Security=True");
        SqlCommand cmd = new SqlCommand("Select *from Users", con);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        da.Fill(ds);
  }

我的界面如下

[ServiceContract]
public interface IService1
{
    [OperationContract]
    void getAllEmpName();
    [OperationContract]
    void editEmployee();
}

在我的网页中,我按照以下方式进行操作

private void get_categories()
    {
        ServiceReference1.Service1Client ws = new ServiceReference1.Service1Client();
        GridView1.DataSource = ws.getAllEmpName();
        GridView1.DataBind();
 }

我收到错误,因为Cannot convert method group 'getAllEmpName' to non-delegate type 'object'. Did you intend to invoke the method?可以提供帮助

1 个答案:

答案 0 :(得分:2)

我看到的第一个问题是您的getAllEmpName()方法是void。它什么都不返回。它不会将数据发送回客户端。

通过WCF传递DataSet并不总是最好的主意。单个DataTable会略好一些,但返回List<>或数组会是最好的。但是,请尝试以下方法:

// Service

DataTable IService1.getAllEmpName()
{
    SqlConnection con = new SqlConnection("Data Source=SYSTEM19\\SQLEXPRESS;Initial Catalog=Dora;Integrated Security=True");
    SqlCommand cmd = new SqlCommand("Select *from Users", con);
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    DataTable dt = new DataTable();
    dt.Fill(dt);
    return dt;
}

[ServiceContract]
public interface IService1
{
    [OperationContract]
    DataTable getAllEmpName();
    [OperationContract]
    void editEmployee();
}

// Client

private void get_categories()
{
    ServiceReference1.Service1Client ws = new ServiceReference1.Service1Client();
    DataTable data = ws.getAllEmpName();
    GridView1.DataSource = data;
    GridView1.DataBind();
}

我也回过头来重读这个,并注意到你没有处理你的WCF客户端。那是!当WCF客户端未正确中止或关闭时,它们可以继续消耗资源,并将保持打开连接,直到它被垃圾回收。关于您可以搜索的主题还有很多其他讨论。

由于ClientBase实现IDisposable,您应该明确处理它。类似的东西:

using(ServiceReference1.Service1Client ws = new ServiceReference1.Service1Client())
{
    try
    {
        // use the "ws" object...
    }
    finally
    {
        if(ws.State == CommunicationState.Faulted)
            ws.Abort();
        else
            ws.Close();
    }
}