Ошибка запроса базы данных - PullRequest
1 голос
/ 03 марта 2012

Мой код:

var db = Database.Open("dbase");
var result = db.Query("SELECT event_id, description, title, event_start, event_end 
                       FROM event 
                       WHERE event_start >= "+ start + " AND event_end <= "+ @end);

foreach(var record in result)
{
   CalendarEvent cevent = new CalendarEvent();
   cevent.id = result.event_id; //error is thrown here
}

Сообщение об ошибке:

CS1061: «System.Collections.Generic.IEnumerable» не содержит определение для 'event_id' и не имеет метода расширения 'event_id' принимая первый аргумент типа 'System.Collections.Generic.IEnumerable' можно найти (есть Вы пропустили директиву использования или ссылку на сборку?)

В моем коде у меня есть:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using WebMatrix.Data;

Что вызывает это?

Ответы [ 4 ]

3 голосов
/ 03 марта 2012

Ну, для начала вы, вероятно, имели в виду record.event_id вместо result.event_id.Ваш код был бы более понятным, если бы вы изменили result на results, учитывая, что это последовательность результатов.

Однако это только перенесет проблему на один этап.Database.Query возвращает IEnumerable<object>, поэтому тип record будет object ... и object также не имеет члена с именем event_id.

Документация для Database.Query довольно расплывчата - возможно, она возвращает динамические объекты.Попробуйте это:

foreach (dynamic record in result)
{
        CalendarEvent cevent = new CalendarEvent();
        cevent.id = record.event_id;
}

РЕДАКТИРОВАТЬ: Если record.event_id работает даже без преобразования в dynamic, то возможно, что эффективный тип результата будет IEnumerable<dynamic> и MSDN просто не очень полезен.

Однако в вашем коде все еще есть проблема: плохая идея включать значения параметров непосредственно в SQL следующим образом:

  • Смешивать код и данные - плохая идея с точки зрения чистоты кода
  • Необходимо убедиться, что даты, числа и т. Д. Имеют правильный формат
  • Это открывает для вас атаки с использованием SQL-инъекций.

Вместо этого вы должны использовать параметризованный запрос , например:

var result = db.Query(
     "SELECT event_id, description, title, event_start, event_end FROM event " +
     "where event_start >= ? AND event_end <= ?",
     start, end);        
1 голос
/ 03 марта 2012
cevent.id = result.event_id; //error is thrown here

должно быть:

cevent.id = record.event_id;
1 голос
/ 03 марта 2012

Вам, вероятно, нужно иметь

cevent.id = record.event_id;

1 голос
/ 03 марта 2012

Не должно

cevent.id = result.event_id; //error is thrown here

быть

cevent.id = record.event_id; 

если что?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...