Kyl*_*yle 27 c# sql sql-server
我有一个DataTable,需要将整个事物推送到Database表.
我可以使用foreach并一次插入每一行来获取所有内容.这非常缓慢,因为有几千行.
有没有办法一次完成整个数据表可能更快?
DataTable的列数少于SQL表.其余的应该留空.
Kyl*_*yle 60
我发现SqlBulkCopy是一种简单的方法,并且不需要在SQL Server中编写存储过程.
以下是我如何实现它的示例:
// take note of SqlBulkCopyOptions.KeepIdentity , you may or may not want to use this for your situation.
using (var bulkCopy = new SqlBulkCopy(_connection.ConnectionString, SqlBulkCopyOptions.KeepIdentity))
{
// my DataTable column names match my SQL Column names, so I simply made this loop. However if your column names don't match, just pass in which datatable name matches the SQL column name in Column Mappings
foreach (DataColumn col in table.Columns)
{
bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
}
bulkCopy.BulkCopyTimeout = 600;
bulkCopy.DestinationTableName = destinationTableName;
bulkCopy.WriteToServer(table);
}
Run Code Online (Sandbox Code Playgroud)
Aar*_*and 31
由于您已经拥有DataTable,并且由于我假设您使用的是SQL Server 2008或更高版本,因此这可能是最简单的方法.首先,在您的数据库中,创建以下两个对象:
CREATE TYPE dbo.MyDataTable -- you can be more speciifc here
AS TABLE
(
col1 INT,
col2 DATETIME
-- etc etc. The columns you have in your data table.
);
GO
CREATE PROCEDURE dbo.InsertMyDataTable
@dt AS dbo.MyDataTable READONLY
AS
BEGIN
SET NOCOUNT ON;
INSERT dbo.RealTable(column list) SELECT column list FROM @dt;
END
GO
Run Code Online (Sandbox Code Playgroud)
现在在您的C#代码中:
DataTable tvp = new DataTable();
// define / populate DataTable
using (connectionObject)
{
SqlCommand cmd = new SqlCommand("dbo.InsertMyDataTable", connectionObject);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter tvparam = cmd.Parameters.AddWithValue("@dt", tvp);
tvparam.SqlDbType = SqlDbType.Structured;
cmd.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud)
如果您在问题中提供了更具体的细节,我会给出一个更具体的答案.
考虑这种方法,您不需要 for 循环:
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.DestinationTableName =
"dbo.BulkCopyDemoMatchingColumns";
try
{
// Write from the source to the destination.
bulkCopy.WriteToServer(ExistingSqlTableName);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
137906 次 |
| 最近记录: |