【问题标题】:How to retrieve multiple rows from SQL Server database in C# using SqlDataReader?如何使用 SqlDataReader 从 C# 中的 SQL Server 数据库中检索多行?
【发布时间】: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 列 startDateYearstartDateMonthstartDateDay,不如考虑使用 startDate 类型的一列 date。除了节省存储空间、验证插入的值以及更容易编写 SQL 查询之外,C# 也更容易编写......其中几行折叠成:newEvent.StartDate = sqlDataReader.GetDateTime(startDateOrdinal); where startDateOrdinal i> 是结果集中的列号。您可以使用GetOrdinal 进行查找,但如果您不使用SELECT *,您会知道它是哪一列。
  • 值得关注Why is SELECT * considered harmful?,包括一些投票率较低的答案。

标签: c# sql sql-server sqldatareader


【解决方案1】:

您的代码似乎没有任何错误。但是我相信您的查询有错误。

首先,在构建 SQL 查询时永远不要使用字符串连接。而是使用Parameterized Queries

使用参数化查询,调试您的 SQL 语句更加容易,因为它不包括条件字符串连接。

【讨论】:

  • T-SQL 语句末尾的;IS 是一个有效字符——事实上,在某些情况下,它甚至是 IS b>必需,通常推荐的最佳做法是在正在编写的新 SQL 代码中使用 ; 终止每个 T-SQL 语句
  • 我查过了。它以两种方式工作。我正在编辑我的答案。谢谢
猜你喜欢
  • 1970-01-01
  • 2012-12-19
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 2019-01-20
相关资源
最近更新 更多