Не удается неявно преобразовать тип 'System.Data.DataSet' в 'System.Collections.Generic.List <CalendarEvent>' '

0

Я новичок в блоке приложений.

Я пытаюсь получить данные из базы данных. Ниже приведен код.

JsonResponse.ashx:

public void ProcessRequest(HttpContext context)
{
    HttpContext _context = HttpContext.Current;

    context.Response.ContentType = "application/json";
    int user_id = Convert.ToInt32(HttpContext.Current.Session["userid"]);
    DateTime start = new DateTime(1970, 1, 1);
    DateTime end = new DateTime(1970, 1, 1);

    start = start.AddSeconds(double.Parse(context.Request.QueryString["start"]));
    end = end.AddSeconds(double.Parse(context.Request.QueryString["end"]));       
    String result = String.Empty;

    result += "[";

    List<int> idList = new List<int>();
    foreach (CalendarEvent cevent in EventDAO.getEvents(start, end, user_id))
    {
        result += convertCalendarEventIntoString(cevent);
        idList.Add(cevent.id);
    }

    if (result.EndsWith(","))
    {
        result = result.Substring(0, result.Length - 1);
    }

    result += "]";
    //store list of event ids in Session, so that it can be accessed in web methods
    context.Session["idList"] = idList;

    context.Response.Write(result);
}

private String convertCalendarEventIntoString(CalendarEvent cevent)
{
    String allDay = "true";
    if (ConvertToTimestamp(cevent.start).ToString().Equals(ConvertToTimestamp(cevent.end).ToString()))
    {

        if (cevent.start.Hour == 0 && cevent.start.Minute == 0 && cevent.start.Second == 0)
        {
            allDay = "true";
        }
        else
        {
            allDay = "false";
        }
    }
    else
    {
        if (cevent.start.Hour == 0 && cevent.start.Minute == 0 && cevent.start.Second == 0
            && cevent.end.Hour == 0 && cevent.end.Minute == 0 && cevent.end.Second == 0)
        {
            allDay = "true";
        }
        else
        {
            allDay = "false";
        }
    }
    return    "{" +
              "id: '" + cevent.id + "'," +
              "title: '" + HttpContext.Current.Server.HtmlEncode(cevent.title) + "'," +
              "start:  " + ConvertToTimestamp(cevent.start).ToString() + "," +
              "end: " + ConvertToTimestamp(cevent.end).ToString() + "," +
              "allDay:" + allDay + "," +
                "user_id:" + cevent.user_id + "," +
              "description: '" + HttpContext.Current.Server.HtmlEncode(cevent.description) + "'" +

              "},";
}

DA:

public static List<CalendarEvent> getEvents(DateTime start, DateTime end, int user_id)
{

    List<CalendarEvent> events = new List<CalendarEvent>();

    SqlParameter[] sqlParam = new SqlParameter[3];
    sqlParam[0] = new SqlParameter("@start", start);
    sqlParam[1] = new SqlParameter("@end", end);
    sqlParam[2] = new SqlParameter("@user_id", user_id);
    return SqlHelper.ExecuteDataset(connectionString,CommandType.StoredProcedure, "GetData", sqlParam);
}

sqlhelper:

public static DataSet ExecuteDataset(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
{
    //create a command and prepare it for execution
    SqlCommand cmd = new SqlCommand();
    cmd.CommandTimeout = 120;
    PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters);

    //create the DataAdapter & DataSet
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    DataSet ds = new DataSet();

    //fill the DataSet using default values for DataTable names, etc.
    da.Fill(ds);

    // detach the SqlParameters from the command object, so they can be used again.         
    cmd.Parameters.Clear();

    //return the dataset
    return ds;                      
}

Я получаю ошибку:

Невозможно неявно преобразовать тип "System.Data.DataSet" в "System.Collections.Generic.List".

Я не могу понять, в чем проблема.

  • 1
    ExecuteDataset возвращает DataSet который вы сразу же пытаетесь вернуть как List<CalendarEvent> из getEvents . Это проблема.
Теги:
sql-server

3 ответа

0

В методе getEvents вам необходимо выполнить итерацию записей в наборе данных и заполнить список, который вы вернете в этом методе.

var dataset = SqlHelper.ExecuteDataset(connectionString,CommandType.StoredProcedure, "GetData", sqlParam);

foreach (var row in ds.Tables["FooTable"].Rows)
{
     events.Add(new CalendarEvent(...));
}

return events;
0

Ваша проблема заключается в этом фрагменте кода:

public static List<CalendarEvent> getEvents(DateTime start, DateTime end, int user_id)
{
    List<CalendarEvent> events = new List<CalendarEvent>();
    SqlParameter[] sqlParam = new SqlParameter[3];
    sqlParam[0] = new SqlParameter("@start", start);
    sqlParam[1] = new SqlParameter("@end", end);
    sqlParam[2] = new SqlParameter("@user_id", user_id);
    return SqlHelper.ExecuteDataset(connectionString,CommandType.StoredProcedure, "GetData", sqlParam);
}

Вы определили тип этого метода как List<CalenderEvent> но вы DataSet. Я не знаю, какие данные содержатся в вашем наборе данных, но я предполагаю, что есть тот, который представляет ваши календари.

Это означает, что вам нужно извлечь данные из своего набора данных и составить список из него. Предполагая, что в вашем наборе данных есть одна таблица, ваш новый метод будет выглядеть примерно так:

public static List<CalendarEvent> getEvents(DateTime start, DateTime end, int user_id)
{
    List<CalendarEvent> events = new List<CalendarEvent>();
    SqlParameter[] sqlParam = new SqlParameter[3];
    sqlParam[0] = new SqlParameter("@start", start);
    sqlParam[1] = new SqlParameter("@end", end);
    sqlParam[2] = new SqlParameter("@user_id", user_id);


    var data = SqlHelper.ExecuteDataset(connectionString,CommandType.StoredProcedure, "GetData", sqlParam);
    events = ds.Tables[0].AsEnumerable().Select(r => new CalenderEvent 
                                         {
                                           //using dummy properties because I dont know 
                                           //your class
                                           Property1 = r.Field<string>("Column1"),
                                           Property2 = r.Field<string>("column2"),
                                           //...
                                         }).ToList();
    return events;
}
  • 0
    .Select (r => new CalenderEvent {// используя фиктивные свойства, потому что я не знаю // ваш класс Property1 = r.Field <string> ("Column1"), Property2 = r.Field <string> ("column2"), //... }).Составлять список();
  • 0
    Что ты хотел сказать мне, Моника?
Показать ещё 2 комментария
0

Это потому, что вы пытаетесь вернуть набор данных как List, а это не так. Вам необходимо преобразовать набор данных в список. Возможным решением было бы изменить метод getEvents на что-то вроде этого ->

public static List<CalendarEvent> getEvents(DateTime start, DateTime end, int user_id)
{

    List<CalendarEvent> events = new List<CalendarEvent>();

    SqlParameter[] sqlParam = new SqlParameter[3];
    sqlParam[0] = new SqlParameter("@start", start);
    sqlParam[1] = new SqlParameter("@end", end);
    sqlParam[2] = new SqlParameter("@user_id", user_id);
    var ds = SqlHelper.ExecuteDataset(connectionString,CommandType.StoredProcedure, "GetData", sqlParam);
    return ds.Tables[0].AsEnumerable().Select(datarow => new CalendarEvent{ Title = datarow.Field<string>("Title), /*the rest of your params*/}).ToList();
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню