pass list of objects to stored procedure from C# to sql server
Edit
I wrote this article while I was writing code for Recipes in code4beginner.com. I have a recipe table and RecipeIngredients table which stores the list of ingredients for a recipe. When I am adding a new recipe I have a list of ingredients that I have to save to the RecipeIngredients table. When a user adds a new Ingredient, I am storing it in a javascript object, I am stringifying the recipe ingredients array of objects to JSON and passing it to the Controller where I am converting it into a C# List<recipeingredients>. And in this article, we will discuss about how to move a C# list of objects to a stored procedure in sql server.
Here is the RecipeIngredients class.
public partial class RecipeIngredients
{
public String IngredientName { get; set; }
public String Quantity { get; set; }
public String UnitName { get; set; }
}
And I want to pass the below list to a stored procedure
List<RecipeIngredients> lstRecipeIngredients
This can be done by creating a user-defined table type in your ms SQL database and passing the C# List of objects as a SqlParameter. I will provide the step by step instructions to do the same.
Summary of Codes
CREATE TYPE [dbo].[type_yourtypename] AS TABLE(
)
CREATE PROCEDURE [dbo].[sp_name]
@SomeName [type_yourtypename] READONLY
AS
C#
using (SqlConnection con = new SqlConnection(Common.Common.StoreCartConnectionString.getConnectionString()))
{
SqlCommand cmd = new SqlCommand("sp_name", con);
cmd.CommandType = CommandType.StoredProcedure;
var SomeName = new SqlParameter("@SomeName", SqlDbType.Structured);
ItemManufacturerList.TypeName = "[type_yourtypename]";
ItemManufacturerList.Value = DataTableData;
cmd.Parameters.Add(SomeName);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
Step 1: Create a user-defined table type
The first thing to do is to create a user-defined data type. The easiest way to create the script is to generate the script for the table and copy-paste the code for generated columns, you can leave the columns you do not need
CREATE TYPE [dbo].[type_recipeingredients] AS TABLE( [IngredientName] [nvarchar](128) NULL, [Quantity] [nvarchar](64) NULL, [UnitName] [nvarchar](64) NULL )
Step 2: Create / Modify the stored procedure to accept list of objects
Here in the stored procedure, you have to add parameter @RecipeIngredients of type type_recipeingredients to receive the list sent from the C# code.
CREATE PROCEDURE [dbo].[sp_recipe_edit_update]
@RecipeId uniqueidentifier,
@RecipeIngredients [type_recipeingredients] READONLY
AS
BEGIN
BEGIN TRANSACTION
SET NOCOUNT ON;
--You can write your Insert / Update Code here
COMMIT
END
GO
Step 3: C# Code call the stored procedure
public void UpdateRecipeIngredients(Guid recipeId, DataTable dtRecipeIngredients)
{
using (SqlConnection con = new SqlConnection(Common.ConnectionString.getConnectionString()))
{
SqlCommand cmd = new SqlCommand("sp_recipe_edit_update", con);
cmd.CommandType = CommandType.StoredProcedure;
var RecipeId = new SqlParameter("@RecipeId", SqlDbType.UniqueIdentifier) { Value = recipeId };
var RecipeIngredients = new SqlParameter("@RecipeIngredients", SqlDbType.Structured) { Value = dtRecipeIngredients, TypeName = "[type_recipeingredients]" };
cmd.Parameters.Add(RecipeId);
cmd.Parameters.Add(RecipeIngredients);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
}
You need to pass recipeid and RecipeIngredients data table to the function. check the code below.
List<recipeingredientssp> lstRecipeIngredientsSP = new List<recipeingredientssp>()
{
new RecipeIngredientsSP() { IngredientName="Mango", Quantity="10", UnitName="Kg" },
new RecipeIngredientsSP() { IngredientName="Coconut", Quantity="1", UnitName="Number" },
new RecipeIngredientsSP() { IngredientName="Chillies", Quantity="2", UnitName="Table Spoon" }
};
DataTable dtRecipeIngredients = lstRecipeIngredientsSP.ToDataTable();
dtRecipeIngredients.TableName = "RecipeIngredients";
new Recipe(Common.ConnectionString).UpdateRecipeIngredients(recipe.Id, dtRecipeIngredients);
check this article to convert from list to data table C# list to datatable