2012-03-03 141 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;