c# – 如何多重插入多条记录?

我有一个名为Entry的类声明如下:

class Entry{
    string Id {get;set;}
    string Name {get;set;}
}  

然后使用ADO.NET接受多个这样的Entry对象以插入数据库的方法:

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语句(构建一个巨大的insert语句和它们的参数并通过网络发送),或者我应该保持一个开放的连接并发送一个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 Server会有性能差异吗?我应该注意什么其他后果?

如果我是你,我不会使用任何一个。

第一个缺点是如果列表中有相同的值,参数名称可能会相冲突。

第二个缺点是您正在为每个实体创建命令和参数。

最好的方法是将命令文本和参数构造一次(使用Parameters.Add添加参数)更改它们在循环中的值并执行命令。这样声明只会准备一次。您也应该在启动循环之前打开连接,然后关闭它。

http://stackoverflow.com/questions/2972974/how-should-i-multiple-insert-multiple-records

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – 如何多重插入多条记录?