Si está utilizando SQL Server 2008, entonces Table-Valued Parameters es una opción viable.
En primer lugar, se crea un user-defined table type que contiene todas sus columnas esperados y los tipos de datos en el lado de SQL Server:
create type dbo.MyTableType as table
(
foo int,
bar varchar(100)
);
a continuación, utilizar lo anterior como el parámetro de tipo de tabla para su procedimiento almacenado:
create procedure uspInsertMyBulkData
(
@myTable dbo.MyTableType readonly
)
as
/* now in here you can use the multi-row data from the passed-in table
parameter, @myTable, to do your selects and inserts*/
Luego, en el lado del cliente C#/.NET, llame a este procedimiento almacenado a través de ADO.NET y pase un DataTable
, un objeto que hereda de DbDataReader
(como DataTableReader
) o un objeto de tipo IEnumerable<SqlDataRecord>
:
// create my source DataTable
object [] row1 = {1, "a"};
object [] row2 = {2, "b"};
var myDataTable = new DataTable();
myDataTable.Columns.Add(new DataColumn("foo"));
myDataTable.Columns.Add(new DataColumn("bar"));
myDataTable.LoadDataRow(row1, true);
myDataTable.LoadDataRow(row2, true);
// bulk send data to database
var conn = new SqlConnection(connectionString);
var cmd = new SqlCommand("uspInsertMyBulkData", conn)
{
CommandType = CommandType.StoredProcedure
};
SqlParameter param = cmd.Parameters.AddWithValue("@myTable", myDataTable);
param.SqlDbType = SqlDbType.Structured;
cmd.ExecuteNonQuery();
¿Es esa una solución elegante? ¿Qué sucedería si tuviera que cambiar el parámetro del procedimiento almacenado a una matriz y disparar como 1000 objetos a la vez, y hacer que el procedimiento almacenado recorra la matriz? – Will
¿Por qué no lo intentas y ves? Si ambas soluciones funcionan, las llamaría elegantes ya que ninguna de ellas parece problemática en teoría.Para mí, con mi conocimiento, sería más fácil hacer bulk-copy + sproc en lugar de múltiples sprocs con matrices, ya que no lo he hecho, pero deberías probarlo. Tú eres el que tiene que mantener el código, así que solo tú sabes lo que será mejor para ti. Me gustaría ver las características de rendimiento también y realmente no puedo decir si uno sería mucho mejor que el otro. –
Curioso: ¿cuál funcionó mejor para ti? (¿Desechar todo en una tabla temporal, en lugar de "fragmentar" las actualizaciones y que el proceso almacenado acepte matrices?) – poundifdef