查询数据库时出错

本文关键字:出错 数据库 查询 | 更新日期: 2023-09-27 18:26:28

我的代码:

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指令或程序集引用?)

在我的代码中,我有:

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

是什么原因造成的?

查询数据库时出错

首先,您可能指的是record.event_id而不是result.event_id。如果将result更改为results,您的代码会更清晰,因为它是结果的序列

然而,这只是将问题转移到一个阶段。Database.Query返回一个IEnumerable<object>,所以record的类型将是object。。。并且CCD_ 9也不具有被称为CCD_。

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);        

不应该

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

cevent.id = record.event_id; 

如果有的话?

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

应该是:

cevent.id = record.event_id;

您可能需要

cevent.id = record.event_id;