Преобразование и возврат списка в WCF

#wcf

#wcf

Вопрос:

привет, друзья, я работаю с WCF с прошлой недели. Я написал несколько примеров, он содержит 2 уровня: бизнес-уровень и уровень DAL. Я хочу отправить список и хочу вернуть список.

Вот проверенный код, исправляющий ошибки.

IEmployee.cs

  [OperationContract]
 List<outEmployee> CreateEmployeeDetails(inemployee InsertEmployee);

 [DataContract]
 public class inemployee
 {
    public string EmployeeID { get; set; }
    public string EmployeeName { get; set; }    
 }

 public class outEmailTemplate
 {
    public string EmployeeID { get; set; }
    public string EmployeeName { get; set; }
 }
  

Employee.svc.cs

  public List<outEmployee> CreateEmployeeDetails(inemployee InsertEmployee)
 {
    EmployeeDac emp = new EmployeeDac();
    return emp.InsertEmployeeDetails(InsertEmployee);
 }
  

EmployeeDac.cs

 public List<outEmployee> InsertEmailTemplate(inEmployee InsertEmp)
{
    SqlConnection con = new SqlConnection(connectionstring);
    SqlCommand cmd;
    cmd = new SqlCommand("SP_InsertEmployee", con);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("employeename", SqlDbType.VarChar).Value = InsertEmp.Employeename;
    con.Open();
    string id = (string)cmd.ExecuteScalar();
    con.Close();
    List<inemployee> oet = new List<inemployee>();
    oet.Add(id);
    return oet;
 }
  

Кто-нибудь, пожалуйста, может исправить ошибки и переписать код.

Здесь я хочу вернуть список в пользовательский интерфейс (silverlight).

Комментарии:

1. Что происходит? Вы получаете сообщение об ошибке?? Если да: что именно это такое?? Кроме того, вы показываете inemployee и outemailtemplate тип, но тип, который возвращается вашей службой, outemployee нигде не указан……

2. получаю ошибку при возврате строки oet в employeedac.

3. Outemailtemplate — это outemployee, который я забыл изменить

4. почему вы всегда возвращаете (в InsertEmailTemplate) список<outEmployee> с 1 элементом?

5. извините, что это InsertEmployeeDetails

Ответ №1:

Несколько проблем:

1) ваши контракты с данными являются неполными — вам нужно в первую очередь украсить все классы, используемые в ваших методах обслуживания (для входных и выходных параметров!) с помощью [DataContract] , и вы также должны украсить все элементы, подлежащие сериализации с помощью [DataMember] :

     [DataContract]
    public class inemployee
    {
       [DataMember]
       public string EmployeeID { get; set; }
       [DataMember]
       public string EmployeeName { get; set; }    
    }

    [DataContract]
    public class outemployee
    {
       [DataMember]
       public string EmployeeID { get; set; }
       [DataMember]
       public string EmployeeName { get; set; }
    }
  

Кстати: почему у вас есть два отдельных типа — inemployee и outemployee ?? Разве не было бы достаточно только одного типа Employee ??

2) Ваш уровень DAL должен учитывать лучшие практики: оберните ваши SqlConnection и SqlCommand в блоки using; для вашего VARCHAR параметра всегда определяйте длину! и самое главное: если вы хотите вернуть List<outemployee> , вам нужно создать список outemployee , а не из inemployee !

И в завершение: вы возвращаете значение id типа string и пытаетесь добавить его string в List<outemployee> — это, конечно, никогда не сработает! Учитывая id , вам нужно создать экземпляр outemployee и добавить это в список.

     public List<outEmployee> InsertEmailTemplate(inEmployee InsertEmp)
    {
        using(SqlConnection con = new SqlConnection(connectionstring))
        using(SqlCommand cmd = new SqlCommand("SP_InsertEmployee", con))
        {
           cmd.CommandType = CommandType.StoredProcedure;
           cmd.Parameters.Add("employeename", SqlDbType.VarChar, 100).Value = InsertEmp.Employeename;

           con.Open();
           string id = (string)cmd.ExecuteScalar();
           con.Close();
        }

        // you want to return outemployee - 
        // so you need to create an outemployee!
        List<outemployee> oet = new List<outemployee>(); 

        // create a new instance of an "outemployee"
        outemployee emp = new outemployee();

        // set the EmployeeID property of the "outemployee" to "id"
        emp.EmployeeID = id;

        // add new "outemployee" to list
        oet.Add(emp);

        return oet;
    }
  

Комментарии:

1. нет, я не создаю экземпляр, вы сказали, что oet.add (id) никогда не работает, но я хочу вернуть идентификатор во внешний интерфейс. теперь, что я могу сделать

2. Marc_s как можно преобразовать datatable в list на уровне dac для критериев поиска. теперь я отправляю datatable в db и получаю результат, теперь я хочу преобразовать в list и вернуть этот список во внешний интерфейс, как я могу это сделать…

3. @Raj: задайте новый вопрос, пожалуйста

4. хорошо, marc для предыдущего без создания экземпляра, можете ли вы вернуть список.

5. хорошо, предположим, я хочу добавить номер ошибки (ABC001 из файла ресурсов, который создается на стороне клиента) в список и вернуть список, можете ли вы добавить его в список.