C#使用SqlBulkCopy将IList <string>插入表中

时间:2018-02-13 06:16:13

标签: c#

我有IList,我试图插入SQL table并遇到性能问题。我现在尝试使用IList<string>SqlBulkCopy的内容插入到SQL表中。

public string toTbl(IList < string > records) {
    const string connectionString = @ "Data Source=sqlserver;Initial Catalog=dbname;User Id=user;Password=password;";    
    try {
        var studentData = from record in records
        let srec = record.Split('|')
        select new Student {
            ID = srec[0],
            Student = srec[1],
            Grade = srec[2]
        };

        foreach(var i in studentData) {
            using(SqlConnection sqlConnection = new SqlConnection(connectionString)) {
                sqlConnection.Open();    
                using(SqlCommand cmd = new SqlCommand("INSERT INTO [Student] ([ID], [Student], [Grade]) VALUES (@ID, @Student, @Grade)", sqlConnection)) {
                    cmd.Parameters.AddWithValue("@ID", i.ID);
                    cmd.Parameters.AddWithValue("@Student", i.Student);
                    cmd.Parameters.AddWithValue("@Grade", i.Grade);    
                    cmd.ExecuteNonQuery();
                }
                sqlConnection.Close();
            }
        }
    } catch (Exception ex) {
        message = ex.Message;
    }
}

1 个答案:

答案 0 :(得分:0)

您不应使用SqlBulkCopy插入List。 请参阅此link for SqlBulkCopy

您需要将数据构造到数据表或数据行或读取器,以使用SqlBulkCopy将其写入数据库。

此外,您不应该在您的评论中添加值到标识列,我认为[ID]是您的标识列。下面的示例有一个数据表(dtStudent),其中包含2列Student和Grade,它会将所有记录写入数据库

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(strConnection))
{
  bulkCopy.ColumnMappings.Add("Student", "Student");
  bulkCopy.ColumnMappings.Add("Grade", "Grade"); 
  bulkCopy.DestinationTableName = "Student";
  bulkCopy.WriteToServer(dtStudent);
}

您也可以使用DataRow []进行插入,请参阅上面提到的链接