public string QuoteIdentifierIfNecessary(string ident) { if (SqlDumper.MustBeQuoted(ident, this)) { return(QuoteIdentifier(ident)); } return(ident); }
protected virtual void RunInserts(ICdlReader reader) { //Connection.SystemConnection.SafeChangeDatabase(DatabaseName); var dda = Connection.GetFactory(ServiceProvider).CreateDataAdapter(); using (DbCommand inscmd = Connection.CreateCommand()) { List <string> colnames = new List <string>(); List <string> vals = new List <string>(); foreach (var colIndexes in _columnMap.Items) { vals.Add("{" + colnames.Count.ToString() + "}"); colnames.Add(DestinationTable.Columns[colIndexes.Target].Name); } string[] values = new string[colnames.Count]; NameWithSchema table = DestinationTable.FullName; string insertTemplate = SqlDumper.Format(Connection.GetFactory(ServiceProvider), "^insert ^into %f (%,i) ^values (%,s)", table, colnames, vals); bool hasident = HasIdentity(reader); DbTransaction trans = Connection.BeginTransaction(); inscmd.Transaction = trans; int okRowCount = 0, failRowCount = 0; List <string> insertErrors = new List <string>(); try { if (hasident) { Connection.RunScript(ServiceProvider, dmp => { dmp.AllowIdentityInsert(table, true); }, trans); } try { int rowcounter = 0; while (reader.Read()) { rowcounter++; var row = reader; for (int i = 0; i < _columnMap.Items.Count; i++) { row.ReadValue(_columnMap.Items[i].Source); values[i] = dda.GetSqlLiteral(row, new DbTypeString()); } inscmd.CommandText = String.Format(insertTemplate, values); if (rowcounter > 10000) { // next transaction trans.Commit(); trans.Dispose(); trans = Connection.BeginTransaction(); inscmd.Transaction = trans; rowcounter = 0; } try { inscmd.ExecuteNonQuery(); okRowCount++; } catch (Exception err) { if (insertErrors.Count < 10) { StringBuilder msg = new StringBuilder(); msg.Append(err.Message); insertErrors.Add(msg.ToString()); } failRowCount++; } } } finally { if (hasident) { Connection.RunScript(ServiceProvider, dmp => { dmp.AllowIdentityInsert(table, false); }, trans); } } trans.Commit(); if (failRowCount > 0) { LogError($"DBSH-00199 Error inserting into table {DestinationTable}, correct inserts {okRowCount}, failed inserts {failRowCount}"); LogError(insertErrors.CreateDelimitedText("\n")); } else { LogInfo($"{okRowCount} rows successfully inserted into table {DestinationTable}"); } } catch (Exception) { trans.Rollback(); throw; } } }