【发布时间】:2018-12-16 20:37:35
【问题描述】:
我正在尝试编写一个方法,该方法应该从数据库中的表中检索多行并使用这些数据来实例化多个对象。但是,据我所知,数据库只返回第一行。当我这样做时:
public static List<Event> getMultipleEvents(string[] eventNames)
{
List<Event> rtnList = new List<Event>();
string EventsToRetrieve = "";
foreach (var item in eventNames)
{
if (EventsToRetrieve != "")
{
EventsToRetrieve += " OR ";
}
EventsToRetrieve += "eventName = '";
EventsToRetrieve += item;
EventsToRetrieve += "' ";
}
// This is the string that the method constructs based on the input i am testing with
//"eventName = 'event six' OR eventName = ' event two' OR eventName = ' event one' OR eventName = ' event seven' "
using (SqlConnection sqlConnection = Globals.GetSqlConnection())
{
sqlConnection.Open();
using (SqlCommand sqlCommand = new SqlCommand("SELECT * FROM questions WHERE " + EventsToRetrieve + ";", sqlConnection))
{
using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader())
{
if (sqlDataReader != null)
{
while (sqlDataReader.Read())
{
Event newEvent = new Event("", DateTime.MinValue, DateTime.MinValue);
string startDateTimeStringFromDB = sqlDataReader["startDateDay"].ToString() + "-" + sqlDataReader["startDateMonth"].ToString() + "-" + sqlDataReader["startDateYear"].ToString();
string endDateTimeStringFromDB = sqlDataReader["endDateDay"].ToString() + "-" + sqlDataReader["endDateMonth"].ToString() + "-" + sqlDataReader["endDateYear"].ToString();
newEvent.EventName = sqlDataReader["eventName"].ToString();
if (DateTime.TryParse(startDateTimeStringFromDB, out DateTime startDateTime))
{
newEvent.StartDate = startDateTime;
}
if (DateTime.TryParse(endDateTimeStringFromDB, out DateTime endDateTime))
{
newEvent.EndDate = endDateTime;
}
rtnList.Add(newEvent);
}
}
}
}
}
return rtnList;
}
谁能向我解释我做错了什么?我还尝试按照此处How to read multiple resultset from SqlDataReader? 的建议将while循环包装在do while循环中,但它没有改变任何东西。
【问题讨论】:
-
不相关的提示:与其拥有 3 列
startDateYear、startDateMonth、startDateDay,不如考虑使用startDate类型的一列date。除了节省存储空间、验证插入的值以及更容易编写 SQL 查询之外,C# 也更容易编写......其中几行折叠成:newEvent.StartDate = sqlDataReader.GetDateTime(startDateOrdinal);where startDateOrdinal i> 是结果集中的列号。您可以使用GetOrdinal进行查找,但如果您不使用SELECT *,您会知道它是哪一列。 -
值得关注Why is SELECT * considered harmful?,包括一些投票率较低的答案。
标签: c# sql sql-server sqldatareader