Tshumore Ответов: 1

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


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

Когда я запускаю функцию , которая обновляет значения, они не обновляются.

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

ALID-HEA-CO-001
ALID-HEA-CO-001
ALID-HEA-CO-001
ЭМИЛЬ-MTR-CO-012
ЭМИЛЬ-MTR-CO-012

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

AG00024
AG00024
AG00024
AG00025
AG00025

В качестве теста я могу получить наборы дубликатов с помощью следующего консольного приложения :

static void Main(string[] args) {
 	List<Broker> BrokerList = GetData();
	foreach(Broker b in BrokerList) {
		Console.WriteLine(b.Code);
	}
}
public static List<Broker> GetData()
        {          
            List<Broker> details = new List<Broker>();
            using (SqlConnection conn = new SqlConnection(Helpers.DatabaseConnect))
            {
                conn.Open();
                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 = Convert.ToString(dr["agent_shortname"]);
                    details.Add(broker);
                }
                conn.Close();
            }
           return  details;
        }

То, на чем я застрял, затем зацикливается на результирующем наборе, так что всякий раз , когда поток программы сталкивается с определенным набором дубликатов, он обновляет этот набор, как показано выше, затем следующий отдельный набор, затем следующий, пока весь результирующий набор не будет обновлен.

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

Функция обновления наборов, и я могу получить самый высокий доступный int с помощью SP spGetHighestAGCode Любая помощь в том, как я могу сделать цикл while, не проверяет правильность изменения наборов дубликатов или что-то неправильно в структуре алгоритма ActionResult:

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

                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("AccountAnalysisResponse");
            }
          return RedirectToAction("AccountAnalysisResponse");
        }

Aarti Meswania

пожалуйста, поставьте свой код для sps, который вы создали, и, похоже, вы можете решить проблемы, используя только sp. пожалуйста, дайте sp подробную информацию, а также примерные данные и необходимые выходные данные, которые облегчат понимание, и вы сможете быстрее получить решение.
.net-код здесь не требуется, так как он будет использоваться только для запуска sp.

1 Ответов

Рейтинг:
0

Patrice T

query = "UPDATE BrokerTest SET  agent_shortname ='" + Convert.ToString(mappinggg.Counter) + "' WHERE agent_shortname='" + dupBroker + "'";

Не обязательно решение вашего вопроса, но у вас есть еще одна проблема.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]


Tshumore

Я могу получить все различные наборы дубликатов с помощью :

var duplicateBrokers = gnbc.FindDuplicates(p => p.Code);

var result = duplicateBrokers.Distinct(StringComparer.OrdinalIgnoreCase);

Выход
ALID-HEA-CO-001
ЭМИЛЬ-MTR-CO-012

Используя этот репрезентативный результирующий набор я смог обновить все значения в первом отчетливом наборе дубликатов используя следующий фрагмент кода:
static void Main(string[] args)
{
NewAGAgentMapping();

}
public static void NewAGAgentMapping()
{

Список<брокер> gnbc = GetData();
используя (sqlconnection с соед = новый объект sqlconnection(помощники.DatabaseConnect))
{
Коннектикут.Открыть();
Модели.Брокер mappinggg = новые модели.Посредник();
SqlCommand cmd = new SqlCommand("GetHighestAGCode", conn);
УМК.CommandType = CommandType.Хранимая процедура;
SqlParameter param = новый SqlParameter("@returnValue", SqlDbType.Int);
УМК.Параметры.Добавить("@аргумент returnvalue", значения sqldbtype.Инт).Направление = ParameterDirection.Выход;
УМК.Метод executenonquery();

int Counter = конвертировать.ToInt32(cmd.Parameters["@returnValue"].Ценность);
int newCode = счетчик + 1;
маппинггг.Счетчик = "AG" + новый код.ToString("000000");

Коннектикут.Закрывать();

//Обновление дубликатов
var duplicateBrokers = gnbc.FindDuplicates(p => p.Code);

var result = duplicateBrokers.Distinct(StringComparer.OrdinalIgnoreCase);
var first = результат.ElementAt(0);

по каждому элементу (ВАР dupBroker в duplicateBrokers)
{

using (SqlConnection conn1 = new SqlConnection(Helpers.DatabaseConnect))
{
conn1.Открыть();
Модели.Брокер mappingg = новые модели.Посредник();
var query = "UPDATE BrokerTest SET agent_shortname =@newanalysiscode WHERE agent_shortname=@firstdistinctset";
Команда SqlCommand = new SqlCommand(query, conn1);
команда.Параметры.AddWithValue ("@newanalysiscode", Convert.Метод toString(mappinggg.Счетчик));
команда.Параметры.AddWithValue("@firstdistinctset", first);
Команда SqlCommand = new SqlCommand(query, conn1);

команда.Метод executenonquery();
conn1.Закрывать();
}
}
}


я.е
ALID-HEA-CO-001 -- AG00024
ALID-HEA-CO-001 -- AG00024
ALID-HEA-CO-001 -- AG00024

Мой вопрос: как мне затем обновить все значения во 2-м отдельном наборе, 3-м отдельном наборе и т. д.С кодом выше 2-й набор успешно обновляется до :
EMIL-MTR-CO-012 -- AG00025
EMIL-MTR-CO-012 -- AG00025

Я чувствую, что есть какой-то метод LINQ, который я могу применить к переменной "результат". В идеале это динамический способ ссылки на значения в "результате", а не использование ElementAt()... тогда будет проще обновить все значения в duplicateBrokers , которые похожи на значение в индексе 0, 1, 2 и т. д. "результата".

Tshumore

Извините за опечатку. Я хотел сказать, что с кодом выше 2-го набора следует обновить до .. На данный момент я могу обновить только 1-й набор как Illustrated. Заранее спасибо всем, кто может предложить дополнительную информацию