Как обновить наборы повторяющихся значений на основе содержащего символа - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть программа для обновления наборов значений дубликатов.Значения в наборе будут обновлены: 1. Содержат ли они определенный символ по заданному индексу.2. Самое высокое доступное значение int в смешанном столбце int / varchar для связанной таблицы.
Я застрял на том, как обновить дублирующиеся наборы для данного набора результатов.Когда я запускаю функцию, значения не обновляются.

Используя SSMS, я могу успешно получить экземпляры дубликатов, используя SP ниже:

    CREATE PROCEDURE [dbo].[getCOAgents]    
    AS
    BEGIN   
SET NOCOUNT ON;
SELECT         a.agent_shortname
    FROM            BrokerTest AS a INNER JOIN
                         (SELECT        agent_shortname, COUNT(*) AS Expr1
                           FROM            BrokerTest
                           GROUP BY agent_shortname
                           HAVING         (COUNT(*) > 1)) AS b ON a.agent_shortname = b.agent_shortname
    WHERE        (a.agent_shortname LIKE '_________C%') AND (a.term = 
    'NB')
    ORDER BY a.agent_shortname
            END
            GO

И это мой код для вызова SP:

    private static List<Broker> GetNewCOBrokerCodes()
    {
        List<Broker> duplicates = new List<Broker>();

        using (SqlConnection conn = new SqlConnection(Helpers.DatabaseConnect))
        {
            DataTable dt = new DataTable();
            SqlCommand cmd = new SqlCommand("getCOAgents", conn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.ExecuteNonQuery();

            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(dt);
            foreach (DataRow dr in dt.Rows)
            {
                Broker broker = new Broker();
                broker.Code = dr["agent_shortname"].ToString();                  
                duplicates.Add(broker);
            }

            conn.Close();
        }
        return duplicates;
    }      

Код для обновления наборов дубликатов приведен ниже. Я могу получить самое высокое значение int, вызвав SP spGetHighestAGCode , но обновление, похоже, не действует, так как значения не меняютсяв базе данных:

    public ActionResult NewAGAgentMapping()
    {
        Models.FileUpload.Mapping mapping = new Models.FileUpload.Mapping();
        try
        {
            List<Broker> gnbc = GetNewCOBrokerCodes();

            using (SqlConnection conn = new SqlConnection(Helpers.DatabaseConnect))
            {
               Models.FileUpload.Mapping mappinggg = new Models.FileUpload.Mapping();
               SqlCommand cmd = new SqlCommand("spGetHighestAGCode", conn);
               cmd.CommandType = CommandType.StoredProcedure;
               SqlParameter param = new SqlParameter("@returnValue", SqlDbType.Int);
               cmd.Parameters.Add("@returnValue", SqlDbType.Int).Direction = ParameterDirection.Output;
               cmd.ExecuteNonQuery();
                 int Counter = Convert.ToInt32(cmd.Parameters["@returnValue"].Value);

                 int newCode = Counter + 1;
                conn.Close();
                mappinggg.Counter = "AG" + newCode.ToString("000000");
              conn.Open();
              SqlDataReader dr = cmd.ExecuteReader();            
              conn.Close();

                //Update the Duplicates
                var duplicateBrokers = gnbc.FindDuplicates(p => p.Code);
                int n = duplicateBrokers.Count;

                for (int i = 0; i < n; i++)
                {
                    //bool isDuplicate = false;
                    for (int j = 0; j < i; j++)
                    {
                        while (duplicateBrokers[i] == duplicateBrokers[j])
                        {
                            foreach (var dupBroker in duplicateBrokers)
                            {
                                using (SqlConnection conn1 = new SqlConnection(Helpers.DatabaseConnect))
                                {
                                    Models.FileUpload.Mapping mappingg = new Models.FileUpload.Mapping();
                                    string query = "UPDATE BrokerTest SET  agent_shortname ='" + Convert.ToString(mappinggg.Counter) + "' WHERE agent_shortname='" + dupBroker + "'";
                                    SqlCommand command = new SqlCommand(query, conn1);
                                    conn1.Open();
                                    command.ExecuteNonQuery();
                                    conn1.Close();
                                }                                  
                            }
                        }
                    }                        
                }
            }                
        }
        catch (Exception ex)
        {
            ViewBag.ErrorMessage = Helpers.Messages.GENERAL_ERROR;
            return View("");
        }
      return RedirectToAction("AccountAnalysisResponse");
    }

Если мой набор результатов возвращает 2 набора дубликатов, которые содержат символ C с индексом 10, следующим образом:

    ALID-HEA-CO-001
    ALID-HEA-CO-001
    ALID-HEA-CO-001
    EMIL-MTR-CO-012
    EMIL-MTR-CO-012

, а в связанной таблице мой запрос возвращаетмаксимальная доступная как 23 (от AG00023), тогда я хочу обновить наборы дубликатов выше как:

    AG00024
    AG00024
    AG00024
    AG00025
    AG00025
...