Страница 1 из 1

как передать в запрос параметр-массив для использования в IN

Добавлено: 25 янв 2014, 16:00
profik777
В запросе необходимо использовать конструкцию типа :

Код: Выделить всё

where id IN (@parameter)
Как я могу передать в параметр массив чисел для использования в запросе?
Если передавать просто строкой "1,2,3" не срабатывает. В итоге запрос преобразуется к

Код: Выделить всё

where id IN ('1,2,2'))
вместо

Код: Выделить всё

where id IN ( 1, 2, 2))

Re: как передать в запрос параметр-массив для использования

Добавлено: 25 янв 2014, 19:54
profik777
И еще вопрос.
Разве я не могу прямо в коде захардкодить дополнительное условие?
Я в коде пишу
this.QueryViolations.SqlCommand =this.QueryViolations.SqlCommand + " where 11=1"
Но эта строка удаляется из кода при формировании отчета.
Что я неверно делаю?

Re: как передать в запрос параметр-массив для использования

Добавлено: 27 янв 2014, 10:05
HighAley
Здравствуйте.

Вы можете использовать следующий код, например:

Код: Выделить всё

StiReport report = new StiReport();
report.Load(@"d:\report.mrt");

//for RequesFromUser panel
StiVariable var1 = report.Dictionary.Variables["Variable1"];
var1.DialogInfo.Keys = new string[] { "1", "2", "3" };
var1.DialogInfo.Values = new string[] { "111", "222", "333" };

report.Compile();
report.Show(true);
и прописать следующий запрос в SqlDataSource:

Код: Выделить всё

select * from YourTable {Variable1.Count == 0 ? "" : "where YourField in (" + Variable1.ToQueryString() + ")"}
Тут есть нюанс. По умолчанию переменные типа List заполняются значениями из словаря только после подключения словаря к источникам данных.
Поэтому при первом подключении источника данных эта переменная будет пустая, и выражение Variable1.ToQueryString() даст пустую строку, соответственно весь запрос выдаст ошибку.
Чтобы избежать этого, в запросе добавлена дополнительная проверка.

В данном примере сразу будут отображаться все данные, а после нажатия кнопки Submit отчет перестроится с использованием только выбранных данных.
Если надо сразу отображать только нужные данные, то есть два варианта:

1. Надо установить свойство отчета report.RequestParameters = true. При этом до первого нажатия кнопки Submit будет отображаться только пустая страница отчета, а построение начнется только после нажатия кнопки.

2. Сразу инициализировать переменную отчета дополнительными значениями.

Код: Выделить всё

StiReport report = new StiReport();
report.Load(@"d:\report.mrt");

//for RequesFromUser panel
StiVariable var1 = report.Dictionary.Variables["Variable1"];
var1.DialogInfo.Keys = new string[] { "1", "2", "3" };
var1.DialogInfo.Values = new string[] { "111", "222", "333" };

//for report rendering before RequesFromUser panel
LongList list = new LongList();
list.AddRange(new long[] {1,2,3});

report.Compile();
report.CompiledReport["Variable1"] = list;
report.Show(true);
Спасибо.