2015-11-28 4 views
3

Im пытается получить все мои записи таблицы с помощью webservice. Я попытался это:Возврат последней строки в webservice

  public class Student 
    { 
     public int id; 
     public string name; 
     public string grade; 
    } 
[WebMethod] 
    public Student[] getall() 
    { 
     Student objStd = new Student(); 
     Student[] stds = new Student[400]; 


     SqlConnection conn; 
     conn = Class1.ConnectionManager.GetConnection(); 
     conn.Open(); 

     SqlCommand newCmd = conn.CreateCommand(); 

     newCmd.CommandType = CommandType.Text; 
     newCmd.CommandText = "select * from dbo.tblUser"; 
     SqlDataReader sdr = newCmd.ExecuteReader(); 

     for (int runs = 0; sdr.Read(); runs++) 
     { 
      objStd.id = Int32.Parse(sdr["Id"].ToString()); 
      objStd.name = sdr["name"].ToString(); 
      objStd.grade = sdr["grade"].ToString(); 
      stds[runs] = objStd; 
     } 
     conn.Close(); 
     sdr.Close(); 
     return stds; 
    } 

, но результат этого таков:

<?xml version="1.0" encoding="UTF-8"?> 

    <ArrayOfStudent xmlns="http://tempuri.org/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
-<Student> 
<id>8</id> 
<name>hhhhh</name> 
<grade>76</grade> 
</Student> 
-<Student> 
<id>8</id> 
<name>hhhhh</name> 
<grade>76</grade> 
</Student> 
-<Student> 
<id>8</id> 
<name>hhhhh</name> 
<grade>76</grade> 
</Student> 
-<Student> 
<id>8</id> 
<name>hhhhh</name> 
<grade>76</grade> 
</Student> 
    .... 

это вернет только последнюю запись снова и снова, почему?

Что я должен исправить в своем коде?

+0

Вы меняли один и тот же объект снова и снова. Поместите 'Student objStd = new Student();' в цикле. –

ответ

2

Сделайте List добавьте к нему и верните, теперь вы возвращаете только последний объект.

Создать экземпляр объекта Student внутри Для Loop

List<Student> stds = new List<Student>(); 
for (int runs = 0; sdr.Read(); runs++) 
     { 
      Student objStd = new Student(); 
      objStd.id = Int32.Parse(sdr["Id"].ToString()); 
      objStd.name = sdr["name"].ToString(); 
      objStd.grade = sdr["grade"].ToString(); 
      stds.Add(objStd); 
     } 
+0

И верните stds.ToArray(), если вам нужен массив в качестве возвращаемого значения. –

+0

СПАСИБО! Отлично! –

0

Создание objStudent внутри цикла, так что вы не постоянно обновлять такой же студент

[WebMethod] 
    public Student[] getall() 
{ 

    Student[] stds = new Student[400]; 


    SqlConnection conn; 
    conn = Class1.ConnectionManager.GetConnection(); 
    conn.Open(); 

    SqlCommand newCmd = conn.CreateCommand(); 

    newCmd.CommandType = CommandType.Text; 
    newCmd.CommandText = "select * from dbo.tblUser"; 
    SqlDataReader sdr = newCmd.ExecuteReader(); 

    for (int runs = 0; sdr.Read(); runs++) 
    { 
     Student objStd = new Student(); 
     objStd.id = Int32.Parse(sdr["Id"].ToString()); 
     objStd.name = sdr["name"].ToString(); 
     objStd.grade = sdr["grade"].ToString(); 
     stds[runs] = objStd; 
    } 
    conn.Close(); 
    sdr.Close(); 
    return stds; 
} 
0

Если количество студента динамична использование вместо массива со статической длиной. Также вы должны создать объект-ученик при чтении новой записи из Reader.

[WebMethod] 
    public Student[] getall() 
{ 
    List<Student> studentList=new List<Student>(); 
    SqlConnection conn; 
    conn = Class1.ConnectionManager.GetConnection(); 
    conn.Open(); 

    SqlCommand newCmd = conn.CreateCommand(); 

    newCmd.CommandType = CommandType.Text; 
    newCmd.CommandText = "select * from dbo.tblUser"; 
    SqlDataReader sdr = newCmd.ExecuteReader(); 

    while(sdr.Read()){ 
     Student student= new Student(); 
     student.id = Int32.Parse(sdr["Id"].ToString()); 
     student.name = sdr["name"].ToString(); 
     student.grade = sdr["grade"].ToString(); 
     studentList.Add(student); 
    } 
    conn.Close(); 
    sdr.Close(); 
    return studentList.ToArray(); 
} 
Смежные вопросы