Member 12586110 Ответов: 1

Запись записей об ошибках в таблицу аудита


Привет, я вставляю данные из 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();
}

1 Ответов

Рейтинг:
2

#realJSOP

Я не знаю, как вы определяете и идентифицируете "запись об ошибке", но я бы записал всю строку csv в одно поле в вашей таблице аудита. Мне кажется, что ваш код синтаксического анализа csv недостаточно надежен, чтобы покрыть все странное, что может произойти. Кроме того, вы можете потенциально перехватить записи об ошибках, прежде чем пытаться переместить данные в базу данных.

Ознакомьтесь с этой статьей. Он содержит синтаксический анализатор CSV, который возвращает объект DataTable с соответствующими типами данных для всех столбцов. Вам нужно будет извлечь соответствующий код (должно быть легко) и поместить его в свой собственный проект.

SQLXAgent - задания для SQL Express - Часть 3 из 6[^]