0

在我的Service1.svc文件中,我有以下内容;

[OperationContract]
public List<Accounts> GetAllAccounts()
{
    string Conn = "......";
    List<Accounts> Accs = new List<Accounts>();

    SqlConnection _con = new SqlConnection(Conn);
    SqlCommand sc = new SqlCommand("SQL QUERY....", _con);
    SqlDataReader reader;

    _con.Open();
    reader = sc.ExecuteReader();
    while (reader.Read()) { Accs.Add(new Accounts() { Name = reader["Name"].ToString(), Qty = Convert.ToInt32(reader["Qty"]), Weight = Convert.ToDecimal(reader["Weight"]), Value = Convert.ToDecimal(reader["Value"]) }); }
    _con.Close();

    return Accs.ToList();
}

public class Accounts
{
    public string Name { get; set; }
    public int Qty { get; set; }
    public decimal Weight { get; set; }
    public decimal Value { get; set; }
}

我知道我的 SQL 是正确的,并且我已将此列表的内容打印到屏幕上以确保数据存在,但是我遇到的问题是当我尝试在浏览器中运行该服务时 - 它失败了。

现在,我相信这是因为我的IService.cs与返回的“列表”控件冲突。我得到的错误是;

我的 Service1.GetAllAccounts() 方法无法实现我的 IService1.GetAllAccounts(),因为它没有匹配的返回类型“System.....List”。

IService1.cs;

[ServiceContract]
    public interface IService1
{

    [OperationContract]
    List<Accounts> GetAllAccounts();
}

public class Accounts
{
    public string Name { get; set; }
    public int Qty { get; set; }
    public decimal Weight { get; set; }
    public decimal Value { get; set; }
}

这个问题听起来很简单,但我对 C# 还很陌生,有人可以建议吗?

4

4 回答 4

2

[DataContract]and[DataMember]属性添加到您的 Accounts 类

[DataContract]
public class Accounts
{
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public int Qty { get; set; }
    [DataMember]
    public decimal Weight { get; set; }
    [DataMember]
    public decimal Value { get; set; }
}

此外,使用服务的客户端代码应配置为接收 System.Collection.Generic.List 作为集合类型

右键单击服务引用并选择“配置服务引用”。在 Collection Type 组合中选择 System.Collection.Generic.List 而不是默认的 Array

只是为了完整性,正如其他人已经说过的那样,拥有两个具有相同名称的类 Accounts 是没有好处的。这只会使编译器混淆到接收错误的地步。你已经创建了一个 List 变量,所以只返回那个变量。

于 2013-08-07T12:00:19.803 回答
2

您得到的错误(其中您省略了相关部分)显示了问题:

我的 Service1.GetAllAccounts() 方法无法实现我的 IService1.GetAllAccounts()因为它没有匹配的返回类型' System.....List '。

您有两个Accounts类,一个在您的服务接口中,一个在您的实现中。它们也可能位于不同的名称空间中。所以你的界面包含一个方法:

List<Accounts(FromInterface)> GetAllAccounts();

你的实现有一个方法:

List<Accounts(FromImplementation)> GetAllAccounts()

这会导致您的错误,因为List<Accounts(FromInterface)>is not List<Accounts(FromImplementation)>

在不同的文件中创建您的Accounts类,并确保接口和实现引用相同的Accounts类型。

于 2013-08-07T12:11:39.120 回答
1
List<Accounts> Accs = new List<Accounts>();

Accs 已经是一个 List 对象,所以,

return Accs.ToList();

应该

return Accs;
于 2013-08-07T12:00:33.710 回答
1

由于某种原因,服务返回的类型只能是数组(Accounts()

在您的函数上点击F12(转到定义),service.GetAllAccounts();您会注意到它返回一个Accounts(),而不是 a List<Accounts>

只需致电service.GetAllAccounts().ToList;,它应该可以解决您的问题。


此外,您不需要Accounts在您的类中重新声明该类,Service1.svc.cs因为它已经在 interface 中IService.cs


编辑:您可能还需要实现您的课程:

public List<Accounts> GetAllAccounts() : IService1 {
    ...
}
于 2013-08-07T12:12:31.550 回答