Я хотел бы порекомендовать вам воспользоваться новым многострочным оператором вставки в SQL 2008, чтобы можно было просто передать оператор SQL следующим образом:
INSERT INTO table1(id,animal_name) values (1,cat),(1,dog),(1,horse)...
К вашей SqlCommand, но я не знаю, как создать такое утверждение, не рискуя стать жертвой атаки SQL-инъекцией.
Другой альтернативой является определение типов таблиц данных в вашей базе данных sql:


И затем создайте DataTable в C #, который соответствует вашему определению типа данных:
DataTable t = new DataTable();
t.Columns.Add("id");
t.Columns.Add("animal_name");
foreach(var element in your animals_list)
{
DaraRow r = t.NewRow();
r.ItemArray = new object[] { element.id, element.animal_name };
t.Rows.Add(r);
}
// Assumes connection is an open SqlConnection.
using (connection)
{
// Define the INSERT-SELECT statement.
string sqlInsert = "INSERT INTO dbo.table1 (id, animal_name) SELECT nc.id, nc.animal_name FROM @animals AS nc;"
// Configure the command and parameter.
SqlCommand insertCommand = new SqlCommand(sqlInsert, connection);
SqlParameter tvpParam = insertCommand.Parameters.AddWithValue("@animals", t);
tvpParam.SqlDbType = SqlDbType.Structured;
tvpParam.TypeName = "dbo.AnimalTable";
// Execute the command.
insertCommand.ExecuteNonQuery();
}
Подробнее здесь .
Или, если вы знакомы с хранимыми процедурами, то же, что и в предыдущем предложении, но с хранимой процедурой получите DataTable t в качестве параметра.
Если ничего из вышеперечисленного не работает для вас, создайте SqlTranscation из объекта Connection и выполните итерацию по каждой строке каждого набора данных, вставляя запись в соответствующую таблицу и, наконец, фиксируйте транзакцию. Пример здесь.