У меня есть класс с именем Entry
объявлен как это:Как мне несколько вставить несколько записей?
class Entry{
string Id {get;set;}
string Name {get;set;}
}
, а затем метод, который будет принимать несколько таких Entry
объектов для вставки в базу данных с помощью ADO.NET:
static void InsertEntries(IEnumerable<Entry> entries){
//build a SqlCommand object
using(SqlCommand cmd = new SqlCommand()){
...
const string refcmdText = "INSERT INTO Entries (id, name) VALUES (@id{0},@name{0});";
int count = 0;
string query = string.Empty;
//build a large query
foreach(var entry in entries){
query += string.Format(refcmdText, count);
cmd.Parameters.AddWithValue(string.Format("@id{0}",count), entry.Id);
cmd.Parameters.AddWithValue(string.Format("@name{0}",count), entry.Name);
count++;
}
cmd.CommandText=query;
//and then execute the command
...
}
}
И мой вопрос заключается в следующем: должен ли я продолжать использовать вышеупомянутый способ отправки нескольких операторов вставки (построить гигантскую строку операторов вставки и их параметры и отправить ее по сети), или я должен сохранить открытое соединение и отправить один оператор insert для каждого как это:
using(SqlCommand cmd = new SqlCommand(){
using(SqlConnection conn = new SqlConnection(){
//assign connection string and open connection
...
cmd.Connection = conn;
foreach(var entry in entries){
cmd.CommandText= "INSERT INTO Entries (id, name) VALUES (@id,@name);";
cmd.Parameters.AddWithValue("@id", entry.Id);
cmd.Parameters.AddWithValue("@name", entry.Name);
cmd.ExecuteNonQuery();
}
}
}
Как вы относитесь? Будет ли разница в производительности на сервере Sql между этими двумя? Есть ли какие-либо другие последствия, о которых я должен знать?
Спасибо за все ваши предложения! я возьму ответ @ Giorgi, потому что он более или менее отвечает на исходный вопрос – bottlenecked
, вы можете использовать пользовательский тип на сервере SQl для передачи DataTable на SQL-сервер http://www.fourthbottle.com/2014/09/how- to-insert-multiple-records-in.html – Venki