2019-08-29 22:26:23
Create User Defined Table Type
/****** Object: UserDefinedTableType [Entity].[EntityUploadType] Script Date: 28/02/2017 16:00:11 ******/ CREATE TYPE [Entity].[EntityUploadType] AS TABLE( [Reference] [varchar](50) NULL, [LetterReference] [varchar](50) NULL, [StatusId] [int] NOT NULL, [DateReceived] [datetime] NOT NULL, [DateClosed] [datetime] NULL, [OriginalProductId] [int] NULL, [OriginalOutcomeId] [int] NULL, [CaseTypeId] [int] NOT NULL, [ComplexityId] [int] NULL, [StatusUpdatedBy] [int] NOT NULL, [StatusUpdatedDate] [datetime] NOT NULL, [CreatedBy] [int] NOT NULL, [CreatedDate] [datetime] NOT NULL, [LastUpdatedBy] [int] NOT NULL, [LastUpdatedDate] [datetime] NOT NULL, [IsVisible] [bit] NOT NULL ) GO
Stored Procedure using the UDT
/****** Object: StoredProcedure [Entity].[spEntityUpload] Script Date: 28/02/2017 16:00:39 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO-- ============================================= -- Author: ALTER PROCEDURE [Entity].[spEntityUpload]-- Create date: -- Description: -- ============================================= -- Add the parameters for the stored procedure here @datatable [Entity].[EntityUploadType] READONLY AS BEGIN-- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON;--insert new data - we validated it on the front end so it's fine to just insert INSERT INTO [Entity].[Entity] ([StatusId] ,[Reference] ,[LetterReference] ,[DateReceived] ,[DateClosed] ,[OriginalProductId] ,[OriginalOutcomeId] ,[CaseTypeId] ,[ComplexityId] ,[PolicyCount] ,[SelectedForQC] ,[SelectedForQA] ,[StatusUpdatedBy] ,[StatusUpdatedDate] ,[CreatedBy] ,[CreatedDate] ,[LastUpdatedBy] ,[LastUpdatedDate] ,[IsVisible]) SELECT StatusId ,Reference ,LetterReference ,DateReceived ,DateClosed ,OriginalProductId ,OriginalOutcomeId ,CaseTypeId ,ComplexityId ,null ,null ,null ,StatusUpdatedBy ,StatusUpdatedDate ,CreatedBy ,CreatedDate ,LastUpdatedBy ,LastUpdatedDate ,IsVisible FROM @datatable END
C#
The two SQL files are attached. In the C#, the method to actually do the insert is below:
public bool SaveEntityDataTable(DataSet ds)
{
try
{
using (SqlConnection conn = new SqlConnection())
{
conn.ConnectionString = this.GetConnectionString();
conn.Open();
SqlCommand command = new SqlCommand("[Entity].[spEntityUpload]", conn);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(new SqlParameter("@dataTable", ds.Tables[0]));
command.ExecuteNonQuery();
return true;
}
}
catch (Exception ex)
{
return false;
}
}
Which calls another function called GetConnectionString(), which looks like this:
public string GetConnectionString()
{
//this derives a "classic" sql connection string from the entity framework connection
return context.Database.Connection.ConnectionString;
}
This all sits within my repository, so if you’ve not already created a data context you’ll need to create one so you can get its connection string. The DataSet input for SaveEntityDataTable was just a new DataSet with one DataTable, containing all the data from the Excel spreadsheet I uploaded into the system and had been validated.
Example of using OUTPUT INSERTED. to return inserted data
BEGIN TRAN
DECLARE @tblSource AS TABLE
(
tableId INT,
[Name] VARCHAR(255),
[Address] VARCHAR(255),
[PhoneNo] VARCHAR(255)
)
INSERT INTO @tblSource
(Name, [Address], PhoneNo)
VALUES
('Yatrix', '1234 Address Stuff', '1')
INSERT INTO @tblSource
(Name, [Address], PhoneNo)
VALUES
('Neil Delaney', '12 Address 1', '2')
INSERT INTO @tblSource
(Name, [Address], PhoneNo)
VALUES
('Jim Delaney', '13 Address 2', '3')
DECLARE @tblTarget AS TABLE
(
tableId INT IDENTITY(1,1) PRIMARY KEY,
[Name] VARCHAR(255),
[Address] VARCHAR(255),
[PhoneNo] VARCHAR(255)
)
INSERT INTO @tblTarget
(Name, [Address], PhoneNo)
OUTPUT
INSERTED.tableId,
INSERTED.Name,
INSERTED.[Address],
INSERTED.PhoneNo
SELECT Name, [Address], PhoneNo
FROM @tblSource
ROLLBACK TRAN