Если вы используете SQL Server 2008, тогда Табличные параметры является приемлемым вариантом.
Сначала вы создаете определяемый пользователем тип таблицы , содержащий все ожидаемые столбцы и типы данных на стороне SQL Server:
create type dbo.MyTableType as table
(
foo int,
bar varchar(100)
);
, затем используйте вышеуказанное в качестве параметра типа таблицы для вашей хранимой процедуры:
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*/
Затем на стороне клиента C # / .NET вызовите эту хранимую процедуру через ADO.NET и передайте либо DataTable
, либо объект, который наследуется от DbDataReader
(например, DataTableReader
), либо объект типа 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();