Цикл по нескольким массивам для объединения

1

У меня 3 массива. Два массива строк, а один - дата/время. Я вытащил все 3 из пользовательского ввода. Каждый массив всегда будет иметь то же точное количество записей, поэтому я хочу, чтобы сделать цикл через все 3 сразу, чтобы создать строку.

Я пытался:

        List<string> results = new List<string>();

        // select

        foreach (string line in array1)
        {
            foreach (string lines in array2)
            {
                foreach (DateTime date in datearray1)
                {
                    results.Add("select * from table1 d, table2 c where d.specheader = c.specheader and c.true_false = true and d.number = " + lines.ToString() + " and d.date = '" + date.ToShortDateString() + "' and d.specnum like '%" + line.ToString() + "';");                        
                }
            }
        }

        results.ToArray();
        foreach (string line in results)
        {
            MessageBox.Show(line);
        }

Пользователь вводит информацию в 3 блока, и я просто пытаюсь объединить SQL-запросы на основе ввода. Однако, когда я пробовал делать это таким образом, он зацикливался 6 раз, когда у меня было всего 2 записи. Есть ли способ объединить строку, используя все 3 массива одновременно (так как запись 1 массива 1, запись 1 массива 2, запись 1 массива 3). Затем перейдите к созданию следующей строки, записи 2 массива 1, запись 2 массива 2, запись 2 массива 3 и т.д.),

Любой вход был бы оценен. Спасибо!

  • 7
    Не используйте конкатенацию строк с операторами SQL в вашем коде C #. Читайте о внедрении SQL.
  • 0
    Поэтому я прочитал об SQLInjection. Полученные SQL-запросы будут показаны в окне, чтобы я мог их скопировать. Я просто пытаюсь сэкономить время, потому что таких записей обычно много. Однако я просто собираюсь скопировать текст (который будет являться получающейся командой SQL) и вставить его для последующего использования. Я все еще нахожусь в опасности в этом смысле? Поскольку я смогу увидеть команду до ее запуска, она не автоматизирована.
Теги:

3 ответа

1

Как сказал первый комментатор (Yuck), не используйте конкатенацию строк в ваш SQL. Вам нужно будет установить команду SQL, а затем передать параметры.

Это, однако, не имеет значения, так как вы просите объединить данные из нескольких массивов в одну строку.

Итерации через один из массивов. Если все они имеют одинаковый счет, вы аккуратно получите данные в одном.

for(int i = 0; i < array1.Length; i++)
{
    results.Add(string.format("Hello you! {0} , {1}, {2}", array1[i], array2[i], datearray[i])
}

Это даст вам желаемый результат, но ваш код будет открыт для уязвимостей в его нынешнем виде. Вам нужно изменить свой подход.

1

Поскольку ваши циклы вложены, вы получаете каждое значение array2 сочетании с каждым значением в array1 (и аналогично datearray1. Поэтому вы получаете слишком много результатов.

Ваши циклы будут работать так, как предполагалось (я использовал аналогичные локальные переменные, чтобы избежать повторного results.Add строки results.Add, и чтобы понять, как код отличается от вашего):

for (int i = 0; i < array1.Length; i++)
{
    string line = array1[i];
    string lines = array2[i];
    DateTime date = datearray1[i];

    results.Add("select * from table1 d, table2 c where d.specheader = c.specheader and c.true_false = true and d.number = " + lines.ToString() + " and d.date = '" + date.ToShortDateString() + "' and d.specnum like '%" + line.ToString() + "';");                        
}

В качестве побочного примечания: создание запроса базы данных таким образом является неэффективным и очень неуверенным (попробуйте прочитать "Sql Injection", чтобы понять, почему). Если вы использовали хранимую процедуру, вы увидите лучшие результаты.

  • 0
    Или вы можете использовать параметризованный SqlCommand, а не просто хранимую процедуру.
0

если количество записей будет одинаковым для всех, вы можете просто сделать цикл for

                for (int 1 = 0; i < datearray1.length; i++)
                {
                    results.Add("select * from table1 d, table2 c 
                                 where d.specheader = c.specheader and c.true_false = true
                                 and d.number = " + array2[i].ToString() + " 
                                 and d.date = '" + datearray1[i].ToShortDateString() + "'
                                 and d.specnum like '%" + array1[i].ToString() + "';");                        
                }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню