У меня 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 и т.д.),
Любой вход был бы оценен. Спасибо!
Как сказал первый комментатор (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])
}
Это даст вам желаемый результат, но ваш код будет открыт для уязвимостей в его нынешнем виде. Вам нужно изменить свой подход.
Поскольку ваши циклы вложены, вы получаете каждое значение 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", чтобы понять, почему). Если вы использовали хранимую процедуру, вы увидите лучшие результаты.
если количество записей будет одинаковым для всех, вы можете просто сделать цикл 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() + "';");
}