#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
!