forked from ThatRendle/Simple.Data
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSqlBulkInserter.cs
More file actions
93 lines (80 loc) · 3.23 KB
/
SqlBulkInserter.cs
File metadata and controls
93 lines (80 loc) · 3.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Simple.Data.SqlServer
{
using System.ComponentModel.Composition;
using System.Data;
using System.Data.SqlClient;
using Ado;
[Export(typeof(IBulkInserter))]
public class SqlBulkInserter : IBulkInserter
{
public IEnumerable<IDictionary<string, object>> Insert(AdoAdapter adapter, string tableName, IEnumerable<IDictionary<string, object>> data, IDbTransaction transaction, Func<IDictionary<string, object>, Exception, bool> onError, bool resultRequired)
{
if (resultRequired)
{
return new BulkInserter().Insert(adapter, tableName, data, transaction, onError, resultRequired);
}
int count = 0;
DataTable dataTable = null;
SqlConnection connection;
SqlBulkCopy bulkCopy;
if (transaction != null)
{
connection = (SqlConnection) transaction.Connection;
bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, (SqlTransaction)transaction);
}
else
{
connection = (SqlConnection) adapter.CreateConnection();
bulkCopy = new SqlBulkCopy(connection);
}
bulkCopy.DestinationTableName = adapter.GetSchema().FindTable(tableName).QualifiedName;
using (connection.MaybeDisposable())
using (bulkCopy)
{
connection.OpenIfClosed();
foreach (var record in data)
{
if (count == 0)
{
dataTable = CreateDataTable(adapter, tableName, record.Keys, bulkCopy);
}
dataTable.Rows.Add(record.Values.ToArray());
if (++count%5000 == 0)
{
bulkCopy.WriteToServer(dataTable);
dataTable.Clear();
}
}
if (dataTable.Rows.Count > 0)
{
bulkCopy.WriteToServer(dataTable);
}
}
return null;
}
private DataTable CreateDataTable(AdoAdapter adapter, string tableName, ICollection<string> keys, SqlBulkCopy bulkCopy)
{
var table = adapter.GetSchema().FindTable(tableName);
var dataTable = new DataTable(table.ActualName);
foreach (var key in keys)
{
if (table.HasColumn(key))
{
var column = (SqlColumn)table.FindColumn(key);
dataTable.Columns.Add(column.ActualName, column.SqlDbType.ToClrType());
bulkCopy.ColumnMappings.Add(column.ActualName, column.ActualName);
}
else
{
// For non-matching columns, add a dummy DataColumn to make inserting rows easier.
dataTable.Columns.Add(Guid.NewGuid().ToString("N"));
}
}
return dataTable;
}
}
}