Как добавить несколько элементов checkboxlist в столбец SQL
Привет всем, мне нужно добавить несколько выбранных элементов checkboxlist в одну строку под столбцом applications, например Business Central, Opera PMS, Micros. Я изо всех сил пытаюсь быть кабелем, чтобы понять сценарий, который нужно написать.
Ниже приведен мой код aspx:
<td class="auto-style15"> <asp:CheckBoxList ID="AppList" runat="server" Height="60px" RepeatColumns="3" RepeatDirection="Horizontal" Width="486px"> <asp:ListItem>Business Central</asp:ListItem> <asp:ListItem>WineMS</asp:ListItem> <asp:ListItem>CPAR</asp:ListItem> <asp:ListItem>OperaPMS</asp:ListItem> <asp:ListItem>My Micos</asp:ListItem> <asp:ListItem>Micros EMC</asp:ListItem> <asp:ListItem>Jet Professional</asp:ListItem> </asp:CheckBoxList> </td>
Вот мой код C#
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data.SqlClient; using System.Data; using System.Configuration; namespace EmployeeRequest { public partial class EmployeeRequestForm : System.Web.UI.Page { string ConnectionString = @"Data Source=sh-jasonkNew\ICTDev;Initial Catalog=NewUserReqForm;Integrated Security=True;"; protected void Page_Load(object sender, EventArgs e) { } protected void btnSubmit_Click(object sender, EventArgs e) { if (txtName.Text == "" || txtSurname.Text == "" || txtDepartment.Text == "") lblErrorMessage.Text = "Please fill Mandatory Fields"; using (SqlConnection sqlCon = new SqlConnection(ConnectionString)) { sqlCon.Open(); SqlCommand SqlCmd = new SqlCommand("EmployeeAdd", sqlCon); SqlCmd.CommandType = CommandType.StoredProcedure; SqlCmd.Parameters.AddWithValue("@Name", txtName.Text.Trim()); SqlCmd.Parameters.AddWithValue("@Surname", txtSurname.Text.Trim()); SqlCmd.Parameters.AddWithValue("@Department", txtDepartment.Text.Trim()); SqlCmd.Parameters.AddWithValue("@EmploymentType", ddlEmploymentType.Text.Trim()); SqlCmd.Parameters.AddWithValue("@CommenceDate", DateTime.Now); SqlCmd.Parameters.AddWithValue("@JobTitle", txtJobTitle.Text.Trim()); SqlCmd.Parameters.AddWithValue("@TelephoneExt", txtTelephoneExt.Text.Trim()); SqlCmd.Parameters.AddWithValue("@Gender", ddlGender.Text.Trim()); SqlCmd.Parameters.AddWithValue("@Workstations", ddlWorkstations.Text.Trim()); SqlCmd.Parameters.AddWithValue("@Applications", AppList.Text.Trim()); SqlCmd.Parameters.AddWithValue("@FolderAccessRights", txtFolderAccessRights.Text.Trim()); SqlCmd.Parameters.AddWithValue("@EmailGroupAccess", txtEmailGroupRights.Text.Trim()); SqlCmd.Parameters.AddWithValue("@Authorisedby", txtAuth.Text.Trim()); SqlCmd.ExecuteNonQuery(); Clear(); lblSuccessMessage.Text = "Information Submitted Successfully"; } } void Clear() { txtName.Text = txtSurname.Text = txtDepartment.Text = Cal1.Text = ddlEmploymentType.Text = txtJobTitle.Text = txtTelephoneExt.Text = ddlGender.Text = txtFolderAccessRights.Text = txtEmailGroupRights.Text = txtAuth.Text =""; hfEmployeeID.Value = ""; lblSuccessMessage.Text = lblErrorMessage.Text = ""; } protected void Calendar1_SelectionChanged(object sender, EventArgs e) { if (!IsPostBack) { } } protected void ImageButton1_Click(object sender, ImageClickEventArgs e) { string chkboxselect = ""; for (int i=0;i<AppList.Items.Count;i++) { if(AppList.Items[i].Selected) { if(chkboxselect == "") { chkboxselect = AppList.Items[i].Text; } else { chkboxselect += "," + AppList.Items[i].Text; } } } string mainconn = ConfigurationManager.ConnectionStrings["NewUserReqFormConnectionString1"].ConnectionString; SqlCommand sqlconn = new SqlCommand(mainconn); string sqlquery = "insert into [dbo].[tbl_EmployeeAdd] ([Applications]) values ('"+ chkboxselect + "')"; } protected void Calendar1_DayRender(object sender, DayRenderEventArgs e) { } } }
Что я уже пробовал:
Я попробовал следующий скрипт, но он по-прежнему не добавляет имена приложений в столбец. что он делает, он только добавляет аббревиатуру первого выбранного флажка, например Bus или Opr, Mic и т. д.
string chkboxselect = ""; for (int i=0;i<AppList.Items.Count;i++) { if(AppList.Items[i].Selected) { if(chkboxselect == "") { chkboxselect = AppList.Items[i].Text; } else { chkboxselect += "," + AppList.Items[i].Text; } } } string mainconn = ConfigurationManager.ConnectionStrings["NewUserReqFormConnectionString1"].ConnectionString; SqlCommand sqlconn = new SqlCommand(mainconn); string sqlquery = "insert into [dbo].[tbl_EmployeeAdd] ([Applications]) values ('"+ chkboxselect + "')"; }
Richard MacCutchan
Код добавляет именно то, что вы говорите ему в приведенном выше списке. Вам нужно проверить, что возвращается AppList.Items[i].Text
Или, может быть, просто не хватает места на дисплее, чтобы показать полные слова.
Richard Deeming
Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.
Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]
CHill60
Это очень, очень плохая практика хранить несколько таких значений - то есть в списке, разделенном запятыми, в одном столбце. Используйте связанную таблицу, содержащую проверенные значения со ссылкой на внешний ключ в таблице EmployeeAdd - одна строка в этой связанной таблице на флажок на сотрудника
SuperJWP
Сотрудник использует несколько приложений, поэтому я не могу создать несколько строк для одного пользователя со всеми соответствующими приложениями, которые использует сотрудник.
Richard Deeming
В этом нет необходимости. Вы создаете одну строку для сотрудника. Затем у вас есть отдельная таблица, в которой хранятся заявки для этого сотрудника.
Поскольку у вас, по-видимому, есть стандартный список приложений, отношения "многие ко многим" были бы лучше всего.Applications
: Идентификатор Приложения, Имя
Содержит стандартный список приложений. Одна строка на приложение.Employee
: Кодсотрудника, ФИО, ...
Содержит сведения о сотруднике. Один ряд на одного сотрудника.EmployeeApplications
: Кодсотрудника, Ид_приложения
Связывает запись сотрудника с приложениями, которые они используют. Одна строка для каждого сотрудника + комбинация приложений.
Напр.:
Приложения
1 | Бизнес-Центр
2 | WineMS
3 | CPAR
Работники
1 | Е1 | ...
2 | Е2 | ...
3 | Е3 | ...
EmployeeApplications
-- Е1 использует бизнес-центр и РЦПУ:
1 | 1
1 | 3
-- E2 использует Business Central, WineMS и CPAR:
2 | 1
2 | 2
2 | 3
-- E3 использует WineMS
3 | 2