Запись записей об ошибках в таблицу аудита
Привет, я вставляю данные из csv-файла в таблицу. Ранее я использовал команду insert для записи данных в таблицу, и мне удалось записать запись проблемы в блоке catch для аудита таблицы, а когда размер файла вырос, это заняло слишком много времени для вставок, поэтому я использую класс SqlBulkCopy. Теперь вместо отката транзакции есть способ записать записи проблем в таблицу аудита. Например, 1-я и 3-я записи хороши, запишите их в таблицу поиска, а 2-я запись имеет некоторые проблемы, поэтому запишите ее в таблицу аудита. Не могли бы вы пожалуйста помочь мне.
Использование команды INSERT.
public string writetotbl(IList < string > records) { string connString = ConfigurationManager.ConnectionStrings["myDBConnString"].ConnectionString; try { var lkup = from record in records let rec = records.Split(',') select new Lookup { Id = rec[0], Code = rec[1], Description = rec[2] }; foreach(var i in lkup) { using(SqlConnection sqlConnection = new SqlConnection(connectionString)) { sqlConnection.Open(); using(SqlCommand cmd = new SqlCommand("INSERT INTO [Lookup] ([Id], [Code], [Description]) VALUES (@Id, @Code, @Description)", sqlConnection)) { cmd.Parameters.AddWithValue("@Id", i.Id); cmd.Parameters.AddWithValue("@Code", i.Code); cmd.Parameters.AddWithValue("@Description", i.Description); cmd.ExecuteNonQuery(); } sqlConnection.Close(); } } } catch (Exception ex) { //Was able to Insert into audit table here message = ex.Message; } }
Что я уже пробовал:
Использование класса SqlBulkCopy.
private string writetotbl(IList<string> records) { string connString = ConfigurationManager.ConnectionStrings["myDBConnString"].ConnectionString; try { var lkup = from record in records let rec = records.Split(',') select new Lookup { Id = rec[0], Code = rec[1], Description = rec[2] }; DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn("@Id", typeof(int))); dt.Columns.Add(new DataColumn("@Code", typeof(string))); dt.Columns.Add(new DataColumn("@Description", typeof(string))); DataRow dr = dt.NewRow(); foreach (var i in lkup) { dr = dt.NewRow(); dr["Id"] = i.Id.Replace("\"", ""); dr["Code"] = i.Code.Replace("\"", ""); dr["Description"] = i.Description.Replace("\"", ""); dt.Rows.Add(dr); } using (var conn = new SqlConnection(connString)) { conn.Open(); using (SqlBulkCopy s = new SqlBulkCopy(conn)) { s.DestinationTableName = "Lookup"; s.BatchSize = dt.Rows.Count; s.BulkCopyTimeout = 0; s.ColumnMappings.Add("Id", "Id"); s.ColumnMappings.Add("Code", "Code"); s.ColumnMappings.Add("Description", "Description"); s.WriteToServer(dt); s.Close(); } conn.Close(); } return (null); } catch (Exception ex) { //How to Insert into audit table here? errmsg = ex.Message; return (errmsg); } }
Member 12586110
Не могли бы вы помочь мне захватить неудачные записи в исключении SqlBulkCopy и записать их в другую таблицу. Все поля в моей таблице имеют тип данных varchar, но просто будьте осторожны, чтобы обрабатывать эти исключения, как показано ниже.
using (SqlCommand cmd = new SqlCommand("вставить в [dbo].[бревно] ([ErrorRecord], [сообщение об ошибке]) значения (@ErrorRecord, @сообщение об ошибке)", для sqlconnection))
{
cmd.параметры.AddWithValue("@ErrorRecord", I.Id + ", " + I. Код + ", " + I. Описание);
cmd.параметры.AddWithValue("@ErrorMessage", ex.Message);
УМК.Метод executenonquery();
}