用C#批量更新

为了在数据库中插入大量数据,我曾经将所有插入信息收集到一个列表中,然后将此列表转换为DataTable。然后,我通过将该列表插入数据库SqlBulkCopy

我将生成的列表发送到哪里

LiMyList

,其中包含要插入数据库的所有批量数据的信息,并将其

传递给批量插入操作

InsertData(LiMyList, "MyTable");

哪里InsertData

 public static void InsertData<T>(List<T> list,string TableName)

{

DataTable dt = new DataTable("MyTable");

clsBulkOperation blk = new clsBulkOperation();

dt = ConvertToDataTable(list);

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);

using (SqlBulkCopy bulkcopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["SchoolSoulDataEntitiesForReport"].ConnectionString))

{

bulkcopy.BulkCopyTimeout = 660;

bulkcopy.DestinationTableName = TableName;

bulkcopy.WriteToServer(dt);

}

}

public static DataTable ConvertToDataTable<T>(IList<T> data)

{

PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));

DataTable table = new DataTable();

foreach (PropertyDescriptor prop in properties)

table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);

foreach (T item in data)

{

DataRow row = table.NewRow();

foreach (PropertyDescriptor prop in properties)

row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;

table.Rows.Add(row);

}

return table;

}

现在我想执行更新操作,有什么办法可以通过SqlBulkCopy从C#.Net 将数据更新到数据库来完成插入数据的操作。

回答:

我之前所做的是将数据从大容量插入临时表中,然后使用命令或存储过程更新与临时表和目标表相关的数据。临时表是一个额外的步骤,但是与逐行更新数据相比,如果行数很大,则批量插入和大规模更新可以提高性能。

例:

public static void UpdateData<T>(List<T> list,string TableName)

{

DataTable dt = new DataTable("MyTable");

dt = ConvertToDataTable(list);

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SchoolSoulDataEntitiesForReport"].ConnectionString))

{

using (SqlCommand command = new SqlCommand("", conn))

{

try

{

conn.Open();

//Creating temp table on database

command.CommandText = "CREATE TABLE #TmpTable(...)";

command.ExecuteNonQuery();

//Bulk insert into temp table

using (SqlBulkCopy bulkcopy = new SqlBulkCopy(conn))

{

bulkcopy.BulkCopyTimeout = 660;

bulkcopy.DestinationTableName = "#TmpTable";

bulkcopy.WriteToServer(dt);

bulkcopy.Close();

}

// Updating destination table, and dropping temp table

command.CommandTimeout = 300;

command.CommandText = "UPDATE T SET ... FROM " + TableName + " T INNER JOIN #TmpTable Temp ON ...; DROP TABLE #TmpTable;";

command.ExecuteNonQuery();

}

catch (Exception ex)

{

// Handle exception properly

}

finally

{

conn.Close();

}

}

}

}

请注意,由于临时表的范围是针对每个连接的,因此单个连接用于执行整个操作,以便能够在每个步骤中使用临时表。

以上是 用C#批量更新 的全部内容, 来源链接: utcz.com/qa/429751.html

回到顶部