public static void Put(this ISqlDumper dmp, string format, params object[] args) { dmp.Stream.Write(SqlDumper.Format(dmp.Dialect, dmp.FormatProperties, dmp.FormatterState, format, args)); }
protected virtual void RunInserts(IDataQueue queue) { Connection.SystemConnection.SafeChangeDatabase(DatabaseName); var dda = Connection.GetAnyDDA(); using (DbCommand inscmd = Connection.DbFactory.CreateCommand()) { List <string> colnames = new List <string>(); List <string> vals = new List <string>(); ITableStructure ts = queue.GetRowFormat; ITableStructure dst_ts = DestinationTable; foreach (IColumnStructure col in ts.Columns) { vals.Add("{" + colnames.Count.ToString() + "}"); colnames.Add(col.ColumnName); } string[] values = new string[colnames.Count]; NameWithSchema table = DestinationTable.FullName; string insertTemplate = SqlDumper.Format(Connection.Dialect, "^insert ^into %f (%,i) ^values (%,s)", table, colnames, vals); bool hasident = HasIdentity(queue); DbTransaction trans = Connection.SystemConnection.BeginTransaction(); inscmd.Connection = Connection.SystemConnection; inscmd.Transaction = trans; int okRowCount = 0, failRowCount = 0; List <string> insertErrors = new List <string>(); try { if (hasident) { Connection.RunScript(dmp => { dmp.AllowIdentityInsert(table, true); }, trans, ProgressInfo); } try { int rowcounter = 0; while (!queue.IsEof) { rowcounter++; IBedRecord row = queue.GetRecord(); for (int i = 0; i < row.FieldCount; i++) { row.ReadValue(i); values[i] = dda.GetSqlLiteral(row); } inscmd.CommandText = String.Format(insertTemplate, values); if (rowcounter > 10000) { // next transaction trans.Commit(); trans.Dispose(); trans = Connection.SystemConnection.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(dmp => { dmp.AllowIdentityInsert(table, false); }, trans, ProgressInfo); } } trans.Commit(); if (failRowCount > 0) { ProgressInfo.LogMessageDetail( "INSERT", LogLevel.Error, String.Format("{0}, OK:{1}, FAIL:{2}", Texts.Get("s_error_inserting_into_table$table", "table", DestinationTable.FullName), okRowCount, failRowCount), insertErrors.CreateDelimitedText("\r\n") ); } else { ProgressInfo.LogMessage("INSERT", LogLevel.Info, Texts.Get("s_inserted_into_table$table$rows", "table", DestinationTable.FullName, "rows", okRowCount)); } } catch (Exception) { trans.Rollback(); throw; } } }