SuperJWP Ответов: 3

Добавление элементов checkboxes в SQL с помощью C#


Мне нужно добавить элементы checkbox в базу данных SQL, но мне трудно найти правильную строку кода, чтобы иметь возможность добавлять элементы. Пользователь будет выбирать несколько элементов, поскольку они используют несколько бизнес-приложений.

Вот код таблицы SQL
CREATE TABLE [dbo].[tbl_EmployeeAdd](
	[EmployeeID] [int] IDENTITY(1,1) NOT NULL,
	[Name] [nvarchar](50) NULL,
	[Surname] [nvarchar](50) NULL,
	[Department] [nvarchar](50) NULL,
	[EmploymentType] [nvarchar](50) NULL,
	[CommenceDate] [date] NULL,
	[JobTitle] [nvarchar](50) NULL,
	[TelephoneExt] [nchar](10) NULL,
	[Gender] [nvarchar](10) NULL,
	[Workstations] [nvarchar](10) NULL,
	[BusinessApplication] [nvarchar](20) NULL,
	[FolderAccessRights] [nvarchar](250) NULL,
	[EmailGroupAccess] [nvarchar](250) NULL,
	[Authorisedby] [nvarchar](50) NULL
) ON [PRIMARY]
GO
Вот код C#
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", txtdept.Text.Trim());
        SqlCmd.Parameters.AddWithValue("@EmploymentType", ComboEmpType.Text.Trim());
        SqlCmd.Parameters.AddWithValue("@CommenceDate", dateTimePicker1.Text.Trim());
        SqlCmd.Parameters.AddWithValue("@Workstations", comboWkst.Text.Trim());
        SqlCmd.Parameters.AddWithValue("@JobTitle", txtJobTit.Text.Trim());
        SqlCmd.Parameters.AddWithValue("@TelephoneExt", txtTel.Text.Trim());
        SqlCmd.Parameters.AddWithValue("@Gender", comboGen.Text.Trim());
        SqlCmd.Parameters.AddWithValue("@BusinessApplication", CPAR.Text.Trim());
        SqlCmd.Parameters.AddWithValue("@FolderAccessRights", txtAxxessRights.Text.Trim());
        SqlCmd.Parameters.AddWithValue("@EmailGroupAccess", EmailGroup.Text.Trim());
        SqlCmd.Parameters.AddWithValue("@Authorisedby", AuthBy.Text.Trim());


        SqlCmd.ExecuteNonQuery();
        MessageBox.Show("Employee Request Form Successfully Completed");
        Clear();
Вот моя хранимая процедура
CREATE PROC [dbo].[EmployeeAdd]

@Name nvarchar(50),
@Surname nvarchar(50),
@Department nvarchar(50),
@EmploymentType nvarchar(50),
@CommenceDate date,
@JobTitle nvarchar(50),
@TelephoneExt nchar(10),
@Gender nvarchar(10),
@Workstations nvarchar(10),
@BusinessApplication nvarchar(20),
@FolderAccessRights nvarchar(250),
@EmailGroupAccess nvarchar(250),
@Authorisedby nvarchar(50)


AS 
	INSERT INTO tbl_EmployeeAdd (
								Name,Surname,Department,EmploymentType,CommenceDate,JobTitle,TelephoneExt,Gender,
								Workstations,BusinessApplication,FolderAccessRights,EmailGroupAccess,Authorisedby							
	) 
	VALUES (@Name,@Surname,@Department,@EmploymentType,@CommenceDate,@JobTitle,@TelephoneExt,@Gender,@Workstations,
			@BusinessApplication,@FolderAccessRights,@EmailGroupAccess,@Authorisedby) 
GO


Что я уже пробовал:

я еще ничего не пробовал, так как я новичок в этом типе кодирования

CHill60

Где вы хотите хранить свои сведения о чекбоксе - похоже, для них нет никаких столбцов

3 Ответов

Рейтинг:
1

Richard Deeming

Цитата:
Пользователь будет выбирать несколько элементов, поскольку они используют несколько бизнес-приложений.
Тогда эта информация должна быть нет храниться в таблице employee.

Вам понадобятся три стола:
  • Таблица, в которой хранится список сотрудников;
  • Таблица, в которой хранится список бизнес-приложений;
  • Таблица, в которой хранятся бизнес-приложения, используемые каждым сотрудником;

CREATE TABLE [dbo].[tbl_EmployeeAdd](
    [EmployeeID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NULL,
    [Surname] [nvarchar](50) NULL,
    [Department] [nvarchar](50) NULL,
    [EmploymentType] [nvarchar](50) NULL,
    [CommenceDate] [date] NULL,
    [JobTitle] [nvarchar](50) NULL,
    [TelephoneExt] [nchar](10) NULL,
    [Gender] [nvarchar](10) NULL,
    [Authorisedby] [nvarchar](50) NULL,
    
    CONSTRAINT [PK_tbl_EmployeeAdd] PRIMARY KEY ([EmployeeID])
);

CREATE TABLE [dbo].[tbl_BusinessApplications](
    [BusinessApplicationID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](20) NOT NULL,
    
    CONSTRAINT [PK_tbl_BusinessApplications] PRIMARY KEY ([BusinessApplicationID])
);

CREATE TABLE [dbo].[tbl_Employee_BusinessApplications](
    [EmployeeID] [int] NOT NULL,
    [BusinessApplicationID] [int] NOT NULL,
    
    CONSTRAINT [PK_tbl_Employee_BusinessApplications] PRIMARY KEY ([EmployeeID], [BusinessApplicationID]),
    CONSTRAINT [FK_tbl_Employee_BusinessApplications_Employee) FOREIGN KEY ([EmployeeID]) REFERENCES [dbo].[tbl_EmployeeAdd] ([EmployeeID]) ON DELETE CASCADE,
    CONSTRAINT [FK_tbl_Employee_BusinessApplications_Application) FOREIGN KEY ([BusinessApplicationID]) REFERENCES [dbo].[tbl_BusinessApplications] ([BusinessApplicationID]) ON DELETE CASCADE
);
Вам нужно будет передать идентификаторы выбранных бизнес-приложений в хранимую процедуру. Существует несколько способов сделать это - например, с помощью табличных параметров:
Использование табличных параметров (компонент Database Engine) - SQL Server | Microsoft Docs[^]
Возвращающие табличное значение параметры - ADO.NET | Майкрософт документы[^]
Использование табличных параметров в SQL Server и .NET[^]
CREATE TYPE [dbo].[IntegerList] As TABLE ([Value] int NOT NULL);
CREATE PROC [dbo].[EmployeeAdd]
(
    @Name nvarchar(50),
    @Surname nvarchar(50),
    @Department nvarchar(50),
    @EmploymentType nvarchar(50),
    @CommenceDate date,
    @JobTitle nvarchar(50),
    @TelephoneExt nchar(10),
    @Gender nvarchar(10),
    @Authorisedby nvarchar(50),
    @BusinessApplications [dbo].[IntegerList] READONLY
)
As
BEGIN
DECLARE @EmployeeID int;
    
    SET NOCOUNT ON;
    
    INSERT INTO dbo.tbl_EmployeeAdd
    (
        Name,
        Surname,
        Department,
        EmploymentType,
        CommenceDate,
        JobTitle,
        TelephoneExt,
        Gender,
        Authorisedby							
    ) 
    VALUES 
    (
        @Name,
        @Surname,
        @Department,
        @EmploymentType,
        @CommenceDate,
        @JobTitle,
        @TelephoneExt,
        @Gender,
        @Authorisedby
    );
    
    SET @EmployeeID = Scope_Identity();
    
    INSERT INTO dbo.tbl_Employee_BusinessApplications
    (
        EmployeeID,
        BusinessApplicationID
    )
    SELECT
        @EmployeeID,
        A.BusinessApplicationID
    FROM
        @BusinessApplications As L
        INNER JOIN dbo.tbl_BusinessApplications As A
        ON A.BusinessApplicationID = L.Value
    ;
END
GO
NB: Судя по именам, я подозреваю, что вам нужно будет сделать что-то подобное для Workstations, FolderAccessRights, и EmailGroupAccess также.


Maciej Los

Хорошо объяснил!

Рейтинг:
1

phil.o

Предположим, что у вас есть данные в сетке и вы хотите сохранить только проверенные элементы: вам просто нужно перечислить только те элементы, которые проверены, и передать каждый из них в ваш SP.

using (SqlConnection SqlCon = new SqlConnection(connectionstring))
{
   SqlCon.Open();
                
   using (SqlCommand SqlCmd = new SqlCommand("EmployeeAdd", SqlCon)
   {
      SqlCmd.CommandType = CommandType.StoredProcedure;

      SqlCmd.Parameters.Add("@Name", DbType.String);
      SqlCmd.Parameters.Add("@Surname", DbType.String);
      SqlCmd.Parameters.Add("@Department", DbType.String);
      SqlCmd.Parameters.Add("@EmploymentType", DbType.String);
      SqlCmd.Parameters.Add("@CommenceDate", DbType.String);
      SqlCmd.Parameters.Add("@Workstations", DbType.String);
      SqlCmd.Parameters.Add("@JobTitle", DbType.String);
      SqlCmd.Parameters.Add("@TelephoneExt", DbType.String);
      SqlCmd.Parameters.Add("@Gender", DbType.String);
      SqlCmd.Parameters.Add("@BusinessApplication", DbType.String);
      SqlCmd.Parameters.Add("@FolderAccessRights", DbType.String);
      SqlCmd.Parameters.Add("@EmailGroupAccess", DbType.String);
      SqlCmd.Parameters.Add("@Authorisedby", DbType.String);

      foreach (var item in theGrid.CheckedItems)
      {
         SqlCmd.Parameters["@Name"].Value = item["Name"].Trim();
         SqmCmd.Parameters["@Surname"].Value = item["Surname"].Trim();
         // ...
         SqlCmd.ExecuteNonQuery();
      }
   }
   MessageBox.Show("Employee Request Form Successfully Completed");
   Clear();
}


Рейтинг:
0

MadMyche

Добавление дополнительных столбцов в таблицу можно легко сделать с помощью ALTER TABLE

ALTER TABLE dbo.tbl_EmployeeAdd 
ADD  Checkbox1  BIT  NULL
,    Checkbox2  BIT  NULL
GO
После того как это будет сделано вам нужно будет сделать следующее ALTER PROCEDURE чтобы использовать эти новые поля, а также редактировать свой код C# для их заполнения

Ссылка:
Добавление столбцов в таблицу (компонент Database Engine) - SQL Server | Microsoft Docs[^]