2012-03-03 72 views
1

我的代码:错误查询数据库

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; 

是什么原因造成的?

回答

3

好下手,你可能是指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

不应该

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

cevent.id = record.event_id; 

如果有什么?

+0

为什么record.event_id? – 2012-03-03 17:27:25

+0

这似乎解决了我的问题!为什么这里使用的记录,这似乎有点反直觉? – 2012-03-03 17:28:21

+0

@SimonKiely:结果表示结果的全部序列*。 'record'就是你目前在回路中查看的单个记录*。 – 2012-03-03 17:29:13

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

应该是:

cevent.id = record.event_id; 
1

你可能需要有

cevent.id = record.event_id;