我是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?
可以提供帮助
答案 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();
}
}