Skip to content

Commit 341f781

Browse files
committed
feat: inserting multiple rows with a single insert statement
1 parent 3fc5ab8 commit 341f781

14 files changed

+203401
-202908
lines changed

‎ChinookDatabase/DataSources/ChinookDatabase.tt‎

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -269,47 +269,59 @@ CREATE INDEX <#= ifkName #> ON <#= strategy.GetFullyQualifiedName(fromTableName)
269269
Populate Tables
270270
********************************************************************************/
271271
<#
272-
var sbFields = new StringBuilder();
272+
var maxRows = 1000;
273273
var sbValues = new StringBuilder();
274274
char delimiter = ',';
275275

276276
foreach (DataTable table in ds.Tables)
277277
{
278278
var tableName = strategy.GetFullyQualifiedName(table.TableName);
279-
#>
280-
<#
281-
foreach (DataRow row in table.Rows)
279+
280+
var columns = table.Columns.Cast<DataColumn>()
281+
.Where(col => !col.AutoIncrement || strategy.PrimaryKeyStrategy == PrimaryKeyStrategy.None)
282+
.ToList();
283+
284+
var fields = string.Join($"{delimiter} ", columns
285+
.Select(col => $"{strategy.FormatName(col.ColumnName)}")
286+
.ToList());
287+
288+
for (var i = 0; i < table.Rows.Count; i++)
282289
{
283-
sbFields.Length = 0;
290+
var row = table.Rows[i];
284291
sbValues.Length = 0;
285-
286-
foreach (DataColumn col in table.Columns)
292+
293+
foreach (var col in columns)
287294
{
288-
string value = row[col.ColumnName].ToString();
289-
if ((col.AutoIncrement && strategy.PrimaryKeyStrategy != PrimaryKeyStrategy.None) || value.Length==0) continue;
290-
291-
if (col.DataType == typeof(DateTime))
295+
var value = row[col.ColumnName].ToString();
296+
if (value.Length == 0 && col.AllowDBNull)
297+
{
298+
value = "NULL";
299+
}
300+
else if (col.DataType == typeof(DateTime))
292301
{
293302
value = strategy.FormatDateValue(value);
294303
}
295-
else if (col.DataType == typeof(String))
304+
else if (col.DataType == typeof(string))
296305
{
297306
value = strategy.FormatStringValue(value);
298307
}
299308

300309
sbValues.AppendFormat("{0}{1} ", value, delimiter);
301-
sbFields.AppendFormat("{0}{1} ", strategy.FormatName(col.ColumnName), delimiter);
302310
}
303311

304-
var fields = sbFields.ToString().Trim().TrimEnd(delimiter);
305312
var values = sbValues.ToString().Trim().TrimEnd(delimiter);
313+
var terminator = (i == table.Rows.Count - 1 || (i > 0 && (i + 1) % maxRows == 0)) ? ";" : ",";
314+
if (i % maxRows == 0)
315+
{
306316
#>
307-
<#= string.Format("INSERT INTO {0} ({1}) VALUES ({2});", tableName, fields, values) #>
317+
318+
<#= $"INSERT INTO {tableName} ({fields}) VALUES" #>
308319
<#
309-
} // foreach DataRow
320+
}
310321
#>
311-
322+
<#= $" ({values}){terminator}" #>
312323
<#
324+
} // foreach DataRow
313325
} // foreach DataTable
314326
#>
315327
<#= strategy.WriteFinishCommit() #>

‎ChinookDatabase/DataSources/Chinook_Db2.sql‎

Lines changed: 15644 additions & 15607 deletions
Large diffs are not rendered by default.

‎ChinookDatabase/DataSources/Chinook_MySql.sql‎

Lines changed: 15644 additions & 15607 deletions
Large diffs are not rendered by default.

‎ChinookDatabase/DataSources/Chinook_MySql_AutoIncrementPKs.sql‎

Lines changed: 15644 additions & 15607 deletions
Large diffs are not rendered by default.

‎ChinookDatabase/DataSources/Chinook_Oracle.sql‎

Lines changed: 15644 additions & 15607 deletions
Large diffs are not rendered by default.

‎ChinookDatabase/DataSources/Chinook_PostgreSql.sql‎

Lines changed: 15644 additions & 15607 deletions
Large diffs are not rendered by default.

‎ChinookDatabase/DataSources/Chinook_PostgreSql_AutoIncrementPKs.sql‎

Lines changed: 15644 additions & 15607 deletions
Large diffs are not rendered by default.

‎ChinookDatabase/DataSources/Chinook_PostgreSql_SerialPKs.sql‎

Lines changed: 15644 additions & 15607 deletions
Large diffs are not rendered by default.

‎ChinookDatabase/DataSources/Chinook_SqlServer.sql‎

Lines changed: 15644 additions & 15607 deletions
Large diffs are not rendered by default.

‎ChinookDatabase/DataSources/Chinook_SqlServerCompact.sqlce‎

Lines changed: 15644 additions & 15607 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)