Это именно то, для чего предназначены табличные параметры - вы можете передать свой список за один раз.
В SQL Server:
CREATE TYPE dbo.Usernames AS TABLE
(
localUsername NVARCHAR(32),
BetfairUsername NVARCHAR(32)
);
GO
CREATE PROCEDURE dbo.Service_Insert_MultipleRows
@u AS dbo.Usernames READONLY
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO dbo.DestinationTable(localUsername, BetfairUsername)
SELECT localUsername, BetfairUsername FROM @u;
END
GO
Теперь в C #:
DataTable tvp = new DataTable();
tvp.Columns.Add(new DataColumn("localUsername"));
tvp.Columns.Add(new DataColumn("BetfairUsername"));
foreach(var item in records)
{
tvp.Rows.Add(item.localUsername, item.BetfairUsername);
}
using (con)
{
SqlCommand cmd = new SqlCommand("Service_Insert_MultipleRows", con);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter tvparam = cmd.Parameters.AddWithValue("@u", tvp);
tvparam.SqlDbType = SqlDbType.Structured;
con.Open();
cmd.ExecuteNonQuery();
}