В этой статье будет создан DataGrid, содержащий элемент управления CheckBox. Этот элемент управления позволяет пользователям выбирать несколько столбцов для подробного просмотра. Если нет возможности восстановить эту функциональность для динамического SQL, необходимо использовать операцию IN.
В конце статьи мы написали пользовательскую функцию SQL Server (UDF), позволяющую разбивать строку на подстроки с разделителями. В этой статье мы увидим, чем может пригодиться такая UDF. Мы создадим веб-форму, в которой пользователь сможет выбрать некоторые записи в DataGrid, установив флажок. Подробности этих проверенных записей появятся в другом DataGrid в форме. Эта форма выглядит как на картинке ниже.
Ниже показан ASPX, который мы использовали для создания формы. Примечание. Как использовать элементы управления TemplateColumn и Checkbox для увеличения столбцов DataGrid. Мы также используем свойство DataKeyField DataGrid, чтобы сообщить объекту, какое поле в записи базы данных будет содержать ключевой идентификатор первой строки.
<form id="Form1" метод="post" runat="server">
<asp:DataGrid id="DataGrid1" runat="server"
AutoGenerateColumns="False" DataKeyField="EmployeeID">
<Столбцы>
<asp:TemplateColumn>
<Шаблон элемента>
<asp:CheckBox runat="server" ID="EmployeeCheckBox" />
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn>
<Шаблон элемента>
<%# DataBinder.Eval(Container.DataItem, "LastName") %>,
<%# DataBinder.Eval(Container.DataItem, "FirstName") %>
</ItemTemplate>
</asp:TemplateColumn>
</Колонки>
</asp:DataGrid>
<hr>
<asp:Button id="Orders" runat="server" Text="Просмотр заказов"></asp:Button>
<час>
<asp:DataGrid ID="DataGrid2" Runat="server" AutoGenerateColumns="True" />
</form>
Когда форма загружена и инициализирована, необходимо собрать верхний DataGrid. Код использует корпоративную библиотеку для доступа к примерной базе данных SQL Sever Northwind и выполняет оператор «ВЫБРАТЬ идентификатор сотрудника, имя, фамилию FROM сотрудников». Код события загрузки следующий:
Private void Page_Load(отправитель объекта, System.EventArgs e)
{
если(!Page.IsPostBack)
{
База данных db = DatabaseFactory.CreateDatabase();
DBCommandWrapper dbCommandWrapper;
используя (dbCommandWrapper = db.GetSqlStringCommandWrapper (SELECT_EMPLOYEES))
{
используя (IDataReader dataReader = db.ExecuteReader(dbCommandWrapper))
{
DataGrid1.DataSource = чтение данных;
DataGrid1.DataBind();
}
}
}
}
Когда пользователь нажимает кнопку «Заказы», мы хотим отобразить вторую таблицу данных, которая соответствует таблицам в базе данных «Сотрудники» и связана с данными «Заказы». Один из способов сделать это — создать динамический SQL и использовать условие ИЛИ для всех идентификаторов сотрудников, необходимых для оператора WHERE.
Второй метод — использовать операцию IN оператора WHERE. Операция IN сравнивает список выражений. Например, следующий оператор возвращает информацию между IDS сотрудников 7 и 4.
ВЫБЕРИТЕ идентификатор сотрудника, имя, фамилию ИЗ сотрудников ГДЕ идентификатор сотрудника IN (7, 4)
Концептуально я хотел бы использовать один строковый параметр для запроса переданных идентификаторов, однако, возможно, как одну строку, его нельзя использовать для операции IN A одиночный строковый параметр. В этом случае оператор SQL будет выглядеть так: «ГДЕ Сотрудник IN ('7, 4')», и база данных вернет сообщение об ошибке, поскольку идентификатор сотрудника имеет тип int, а не varchar.
Однако мы используем функцию разделения, созданную в статье, для разделения строки на разные значения. Передаем строку '7, 4' в функцию разделения и мы получим две записи, соответствующие значениям 4 и 7. SQL-запрос для выбора сотрудников и подсчета суммы их заказов будет выглядеть следующим образом:
SELECT count(*) AS Orders, E.FirstName, E.LastName
FROM Orders O
INNER JOIN Сотрудники E ON O.EmployeeID = E.EmployeeID
WHERE E.EmployeeID IN(SELECT Value FROM fn_Split(@employeeIDs, ','))
GROUP BY FirstName, LastName
ORDER BY count(*) DESC
Для использования приведенного выше запроса необходимо установить и передать параметр @employeeIDs. Этот параметр будет представлять собой список идентификаторов, разделенных запятыми. Чтобы построить эту строку и выяснить, была ли строка выбрана пользователем, нам нужно использовать цикл, который перебирает количество строк и проверяет каждый элемент управления флажком. Если пользователь выбирает строку, ключ сохраняется в файле сотрудника путем извлечения средства проверки из свойства DataKeys таблицы (которое было создано в файле ASPX для указания на поле «EmployeeID»).
частная строка GetCheckedEmployeeIDs()
{
Разделитель строк = String.Empty;
StringBuilder идентификаторы сотрудников = новый StringBuilder();
for(int i = 0; я <DataGrid1.Items.Count; i++)
{
флажок CheckBox;
флажок = DataGrid1.Items[i].FindControl("EmployeeCheckBox") как CheckBox;
if(флажок!= ноль && флажок.Проверено == true)
{
сотрудниковIDs.Append(разделитель + DataGrid1.DataKeys[i].ToString());
разделитель = ",";
}
}
Возвращаем идентификаторы сотрудников.ToString();
}
Вышеупомянутый метод возвращает строку, например «10, 7, 20». Обработчик событий нажатия кнопки «Заказы» будет включать метод, который передает информацию в SQL для получения списка сотрудников и заказов и связывает результаты во втором объекте DataGrid.
частный void Orders_Click (отправитель объекта, System.EventArgs e)
{
строка сотрудниковIDs = GetCheckedEmployeeIDs();
База данных db = DatabaseFactory.CreateDatabase();
DBCommandWrapper dbCommandWrapper;
используя (dbCommandWrapper = db.GetSqlStringCommandWrapper (SELECT_ORDERS))
{
dbCommandWrapper.AddInParameter("@employeeIDs", DbType.String, идентификаторы сотрудника);
используя (IDataReader dataReader = db.ExecuteReader(dbCommandWrapper))
{
DataGrid2.DataSource = чтение данных;
DataGrid2.DataBind();
}
}
}