Цикл while продолжает возвращать повторяющуюся информацию

#c# #sql #while-loop #idatareader #textwriter

#c# #sql #цикл while #idatareader #textwriter

Вопрос:

У меня есть функция, предназначенная для получения значений из таблицы базы данных SQL (называемой ProductProfiles) и отображения их в документе .csv, который пользователи могут загружать и просматривать. Результаты основаны на выборе выпадающего списка (называется ddlClassification). Функция работает почти идеально, но цикл while, используемый для записи данных sql в файл .csv, продолжает повторять данные. Например, если существует 3 записи (мы будем называть их A, B и C), в файле .csv должно отображаться только 3 записи. Однако, с тем, что происходит сейчас, эти 3 записи повторяются несколько раз в файле .csv, что неверно.

Я не уверен, чего мне не хватает в функции, чтобы покончить с этой повторяющейся проблемой.

Это функция

 private void WriteProductProfile(string ProfileID, ref TextWriter tw)
{
    string CatList = GetCatList();

    string sqlQuery = @"SELECT [ProfileID], [Name], [Description], [SpeciesLink],
          [LineDraw], [LineDrawThumbnail], [ProfileThumbnail], [ComponentThickness],
          [ComponentWidth], [ComponentFactor], [FinishedThickness], [FinishedWidth],
          ISNULL([ClassificationID],-1) as ClassificationID, [StockOrCust],
          [Visibility], [Notes], [OrderBy]
        FROM ProductProfile
        WHERE ClassificationID = @ClassificationID";
    using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["AbleCommerce"].ToString()))
    {
        SqlCommand cmd = new SqlCommand(sqlQuery, cn);
        cmd.Parameters.Add(new SqlParameter("@ClassificationID", ddlClassification.SelectedValue));
        cmd.CommandType = CommandType.Text;
        cn.Open();
        using (IDataReader reader = cmd.ExecuteReader())
        {
            while(reader.Read())
            {
                string myLine = reader["ProfileID"]   "t"
                      ImportHelper.CleanHTMLText(reader["Name"].ToString())   "t"
                      ImportHelper.CleanHTMLText(reader["Description"].ToString())   "t"
                      reader["SpeciesLink"]   "t"
                      reader["LineDraw"]   "t"
                      reader["LineDrawThumbnail"]   "t"
                      reader["ProfileThumbnail"]   "t"
                      reader["ComponentThickness"]   "t"
                      reader["ComponentWidth"]   "t"
                      reader["ComponentFactor"]   "t"
                      reader["FinishedThickness"]   "t"
                      reader["FinishedWidth"]   "t"
                      reader["ClassificationID"]   "t"
                      reader["StockOrCust"]   "t"
                      reader["Visibility"]   "t"
                      ImportHelper.CleanHTMLText(reader["Notes"].ToString())   "t"
                      reader["OrderBy"]   "t";
                tw.WriteLine(myLine);
            }
        }
        cn.Close();
    }
}
 

Это код, вызывающий функцию WriteProductProfile

 private void ProcessCategory(Category MainCat, ref TextWriter tw, ref string ProdUseList)
{
    string sqlQuery = "SELECT [ProfileID], [ClassificationID] FROM baird_ProductProfile WHERE ClassificationID = @ClassificationID";
    string profId = "";
    using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["AbleCommerce"].ToString()))
    {
        SqlCommand cmd = new SqlCommand(sqlQuery, cn);
        cmd.Parameters.Add(new SqlParameter("@ClassificationID", ddlClassification.SelectedValue));
        cmd.CommandType = CommandType.Text;
        cn.Open();
        using (IDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                profId = reader["ProfileID"].ToString();
            }
        }
        cn.Close();
    }

    foreach (CatalogNode subCat in MainCat.CatalogNodes)
    {
        //process the children items
        switch (subCat.CatalogNodeType)
        {
            case CatalogNodeType.Category:
                ProcessCategory((Category)subCat.ChildObject, ref tw, ref ProdUseList);
                break;
            case CatalogNodeType.Product:
                if (AddProduct(profId, ref ProdUseList))
                    WriteProductProfile(profId, ref tw);
                break;
        }
    }
}
 

Комментарии:

1. «Цикл While продолжает повторяться» — ну, это то, для чего мы его используем…

2. Когда вы устанавливаете точку останова в цикле while, что происходит, когда вы ожидаете его завершения?

3. Ваш цикл выглядит нормально. Это больше похоже на проблему с запросом, чем на проблему с циклом while. Вы уверены, что ваши данные не повторяются в результатах запроса? Если это запрос, самым быстрым решением будет изменить ваш запрос на "Select Distinct [ProfileID] ..."

4. Возможно ли, что WriteProductProfile вызывается несколько раз?

5. Он вызывается в a foreach , поэтому его можно вызывать несколько раз, если MainCat их несколько CatalogNodes !