c# sql-server tsql stored-procedures ado.net

c# - Pasar DataTable al procedimiento almacenado como argumento



sql-server tsql (2)

Tengo una tabla de datos creada en C #.

DataTable dt = new DataTable(); dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("Age", typeof(int)); dt.Rows.Add("James", 23); dt.Rows.Add("Smith", 40); dt.Rows.Add("Paul", 20);

Quiero pasar esto al siguiente procedimiento almacenado.

CREATE PROCEDURE SomeName(@data DATATABLE) AS BEGIN INSERT INTO SOMETABLE(Column2,Column3) VALUES(......); END

Mi pregunta es: ¿cómo insertamos esas 3 tuplas en la tabla SQL? ¿Necesitamos acceder a los valores de columna con el operador de punto? o hay alguna otra forma de hacer esto?


Primero necesita crear un tipo de tabla definida por el usuario que se asemeje a su tabla actual. Vea el ejemplo a continuación,

CREATE TYPE SomeType AS TABLE ( C1 int, C2 VARCHAR(50) ) After this you need to create a stored procedure that takes this table type as parameter. CREATE PROCEDURE SomeUSP @tabType SomeType READONLY AS BEGIN SET NOCOUNT ON; INSERT INTO Yourtable(C1,C2) SELECT C1,C2 FROM @tabType END

Eso es todo ... Trabajo hecho :)


Puede cambiar el procedimiento almacenado para aceptar un parámetro valuado como una entrada. Primero, sin embargo, deberá crear un TIPO de tabla definido por el usuario que coincida con la estructura de la tabla de datos C #:

CREATE TYPE dbo.PersonType AS TABLE ( Name NVARCHAR(50), -- or whatever the length of the `SOMETABLE` column Age INT );

Ajuste su SPROC:

CREATE PROCEDURE dbo.InsertPerson @Person dbo.PersonType READONLY AS BEGIN INSERT INTO SomeTable(Column1, Column2) SELECT p.Name, p.Age FROM @Person p; END

Cuando vincula la tabla de datos al parámetro PROC, debe especificar el parámetro como:

parameter.SqlDbType = SqlDbType.Structured; parameter.TypeName = "dbo.PersonType";

Consulte también el ejemplo aquí Pasar un parámetro de valor de tabla a un procedimiento almacenado