Tshumore Ответов: 1

Почему мой oracledatareader извлекает только 1 случайную строку


У меня есть программа, которая извлекает действительные адреса электронной почты из таблицы базы данных Oracle и записывает их в текстовый файл. Когда я запускаю программу, я получаю только 1 случайную строку вместо 300000+ строк. Когда я перехожу через код, я вижу, что возвращаемое значение повторяется во всех возвращенных строках.

Это мой код для извлечения данных :

<pre>
  List<Flex> details = new List<Flex>();
try
            {

                using (OracleConnection connp = new OracleConnection(FCUBSConnection))
                {
                    connp.Open();                 
                    OracleCommand cmd1 = new OracleCommand("SELECT FCPREPROD.STTM_CUST_PERSONAL.CUSTOMER_NO,FCPREPROD.STTM_CUST_PERSONAL.MOBILE_NUMBER,FCPREPROD.STTM_CUST_PERSONAL.LAST_NAME,FCPREPROD.STTM_CUST_PERSONAL.E_MAIL,FCPREPROD.STTM_CUST_PERSONAL.FIRST_NAME,FCPREPROD.STTM_CUSTOMER.LOCAL_BRANCH  FROM FCPREPROD.STTM_CUST_PERSONAL INNER JOIN FCPREPROD.STTM_CUSTOMER ON FCPREPROD.STTM_CUST_PERSONAL.CUSTOMER_NO = FCPREPROD.STTM_CUSTOMER.CUSTOMER_NO", connp);                 
                    OracleDataReader dr1 = cmd1.ExecuteReader();
                    
                    while ( dr1.Read())
                    {
                        var model = new Flex();
                        model.EmailAddress = Convert.ToString(dr1["E_MAIL"]);
                        model.FirstName = Convert.ToString(dr1["FIRST_NAME"]);
                        model.LastName = Convert.ToString(dr1["LAST_NAME"]);
                        model.MobileNo = Convert.ToString(dr1["MOBILE_NUMBER"]);
                        model.CustNo = Convert.ToString(dr1["CUSTOMER_NO"]);
                        details.Add(model);
                    }
                  
                    connp.Close();
                }                

                foreach (var email in details)
                {

                 

                    if (!string.IsNullOrEmpty(email.EmailAddress) && IsValidEmail(email.EmailAddress))
                    {
                     
                        //write recipients to logfile
                        string realPath = @"C:\Users\tshumae\Documents\";
                        string appLog = "SSP_EMAILS";
                        var logPath = realPath + Convert.ToString(appLog) + DateTime.Today.ToString("dd -MM-yy") + ".txt";
                        try
                        {
                            if (!File.Exists(logPath))
                        {
                            File.Create(logPath).Dispose();

                            using (StreamWriter sw = File.AppendText(logPath))
                            {
                                sw.WriteLine(email.EmailAddress + " " + email.LastName);
                                sw.Flush();
                                sw.Close();
                            }
                        }
                    }
                        catch (UnauthorizedAccessException ex)
                    {

                    }

                }
            }

            }
            catch (Exception ex)
            {
                ExceptionLogger.SendErrorToText(ex);
            }



Что я упускаю ? Похоже, что существует некоторая трансформация, которая происходит по мере того, как DataReader циклически перебирает записи и добавляет их в подробности

Что я уже пробовал:

Я попытался переместить модель из цикла while как показано ниже но вместо этого я все еще получаю 1 строку :
var model = new Flex();
                    while ( dr1.Read())
                    {
                        
                        model.EmailAddress = Convert.ToString(dr1["E_MAIL"]);
                        model.FirstName = Convert.ToString(dr1["FIRST_NAME"]);
                        model.LastName = Convert.ToString(dr1["LAST_NAME"]);
                        model.MobileNo = Convert.ToString(dr1["MOBILE_NUMBER"]);
                        model.CustNo = Convert.ToString(dr1["CUSTOMER_NO"]);
                        details.Add(model);
                    }

1 Ответов

Рейтинг:
1

OriginalGriff

Почему? Потому что ты сам так сказал.
Вы создаете один экземпляр класса Flex, а затем добавляете его несколько раз в коллекцию yoru, перезаписывая предыдущие данные каждый раз, когда roudn цикл.

Если я упрощу то что вы сделали это может быть яснее:

int x;
for (i = 0; i < 5; i++)
   {
   x = i;
   }
Console.WriteLine(x);
Вы ожидаете, что печать будет содержать "0, 1, 2, 3, 4" или просто "4"?

Вы сделали то же самое - переместите конструктор внутрь цикла, и он добавит другие значения:
while ( dr1.Read())
{
    var model = new Flex();
    model.EmailAddress = Convert.ToString(dr1["E_MAIL"]);
    model.FirstName = Convert.ToString(dr1["FIRST_NAME"]);
    model.LastName = Convert.ToString(dr1["LAST_NAME"]);
    model.MobileNo = Convert.ToString(dr1["MOBILE_NUMBER"]);
    model.CustNo = Convert.ToString(dr1["CUSTOMER_NO"]);
    details.Add(model);
}