#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 из файла ресурсов, который создается на стороне клиента) в список и вернуть список, можете ли вы добавить его в список.