为什么 ExecuteReader() 只有 returns 第一行?

Why ExecuteReader() only returns the first row?

希望你们一切都好。我试图从 table 中获取所有行,然后将它们放入列表中,但 ExecuteReader 仅 returns 第一行。它与列表有关还是有其他技术?有人可以帮忙吗!

using (SqlConnection mySqlConnection = new SqlConnection(AppConfiguration.ConnectionString))
        {
            SqlCommand myCommand = new SqlCommand("SelectCity", mySqlConnection);
            myCommand.CommandType = CommandType.StoredProcedure;

            SqlParameter prmcountrycode = new SqlParameter("@countrycode", SqlDbType.NVarChar, 50);
            prmcountrycode.Value = countrycode;
            myCommand.Parameters.Add(prmcountrycode);

            mySqlConnection.Open();
            List<string> allcitiesnames = new List<string>();

            using (SqlDataReader myReader = myCommand.ExecuteReader())
            {
                int count = myReader.FieldCount;
                if (myReader.Read())
                {
                     allcitiesnames.Add(myReader.GetString(myReader.GetOrdinal("CityName")));

                }
                else
                {
                    mySqlConnection.Close();
                    InsertNewCity(countrycode);

                }

                myReader.Close();
            }
            mySqlConnection.Close();
        }

基本上SqlDataReader设计为一次读取数据库行

改变

if (myReader.Read())
{
    allcitiesnames.Add(myReader.GetString(myReader.GetOrdinal("CityName")));
}
else
{
    mySqlConnection.Close();
    InsertNewCity(countrycode);

}

while(myReader.Read())
{
    if (myReader.Read())
    {
        allcitiesnames.Add(myReader.GetString(myReader.GetOrdinal("CityName")));
    }
    else
    {
        mySqlConnection.Close();
        InsertNewCity(countrycode);
    }
}

更新:

我建议您将程序更改为

,而不是两次调用数据库
create procedure SelectCity
    @countrycode nvarchar(50)
as 
begin    
    if exists(select top 1 CountryCode from mytable where CountryCode=@countrycode)
    begin
        select * from mytable 
    end
else
begin
    insert into mytable (CountryCode)
    values (@countryCode)
end
end

所以这将 select 所有如果存在,否则将其插入 table 通过使用 SqlDataReaderExecuteReader

,其余部分将相同

如果你想直接使用所有行,你必须使用 SqlDataAdapter 并使用 DataTable 填充数据库中的数据,然后 return 来自数据库的 DataTable

SqlDataReader 以顺序方式逐行获取,参见 here how to use SqlDataAdapter, Also see this MSDN article

示例:

        // Use DataAdapter to fill DataTable
        DataTable t = new DataTable();

         // 1
        // Open connection
        using (SqlConnection c = new SqlConnection("Connection string here"))
        {
          c.Open();
          // 2
          // Create new DataAdapter
          using (SqlDataAdapter a = new SqlDataAdapter("Query Here", c))
             {
               // 3
               // Fill DataTable with data
               a.Fill(t);

             }
         }

试试这个,

while(myReader.Read())
{
  allcitiesnames.Add(myReader.GetString(myReader.GetOrdinal("CityName")));
}