эффективный способ хранить большие данные в базе данных - PullRequest
1 голос
/ 06 декабря 2011

Я создал таблицу данных динамически из текстового файла. Теперь мне нужно сохранить значения в базе данных. Я нашел какой-то пример, используя foreach и строку данных, и он отлично работает

  foreach (DataRow row in dt.Rows)
  {
      // insert statement
  }

Я сомневаюсь, чтотаблица данных может содержать тысячи строк, эффективно ли использовать цикл foreach или я должен использовать другие методы, такие как массовое копирование (я понятия не имею об этом, поэтому помогите мне). Спасибо

Ответы [ 2 ]

5 голосов
/ 06 декабря 2011

Если вы используете SQL Server, вы должны использовать класс SqlBulkCopy .

Я перешел из цикла, как вы описали, к использованию этого класса на большом наборе данных в одном из моих приложений, и повышение производительности было невероятным.

3 голосов
/ 06 декабря 2011

Мне придется второй SqlBulkCopy.Я использую его для загрузки миллионов или строк в EAV DB через интерфейс IDataReader, и это делается менее чем за минуту.Пример того, как я его использую, выглядит следующим образом:

    private void SaveAll(List<MyBO> bos, IDbConnection conn, IDbTransaction trans)
    {
        using (GenericListDataReader<MyBO> reader = new GenericListDataReader<MyBO>((IEnumerable<MyBO>)bos))
        {
            using (SqlBulkCopy bcp = new SqlBulkCopy(
                           (SqlConnection)conn, SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.FireTriggers,
                           (SqlTransaction)trans))
            {
                bcp.BulkCopyTimeout = Constants.BULK_COPY_TIMEOUT;

                bcp.DestinationTableName = "MainAttr";
                SqlBulkCopyColumnMapping mapID =
                new SqlBulkCopyColumnMapping("Id", "Id");
                bcp.ColumnMappings.Add(mapID);

                SqlBulkCopyColumnMapping mainId =
                    new SqlBulkCopyColumnMapping("Mainid", "MainId");
                bcp.ColumnMappings.Add(mainId);

                SqlBulkCopyColumnMapping mapCol =
                    new SqlBulkCopyColumnMapping("Attributecolumn", "AttributeColumn");
                bcp.ColumnMappings.Add(mapCol);

                SqlBulkCopyColumnMapping mapVal =
                    new SqlBulkCopyColumnMapping("Attributevalue", "AttributeValue");
                bcp.ColumnMappings.Add(mapVal);

                SqlBulkCopyColumnMapping mapLoadDate =
                    new SqlBulkCopyColumnMapping("Loaddate", "LoadDate");
                bcp.ColumnMappings.Add(mapLoadDate);

                SqlBulkCopyColumnMapping mapLoadBy =
                    new SqlBulkCopyColumnMapping("Loadby", "LoadBy");
                bcp.ColumnMappings.Add(mapLoadBy);

                SqlBulkCopyColumnMapping mapDetail =
                    new SqlBulkCopyColumnMapping("detailid", "DetailId");
                bcp.ColumnMappings.Add(mapDetail);

                bcp.NotifyAfter = Constants.BULK_COPY_PROGRESS_REPORT;
                bcp.SqlRowsCopied += new SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);

                bcp.WriteToServer(reader);

            }
        }
    }

Кстати, если вы заинтересованы в том, чтобы узнать больше о ваших параметрах, то на MSDN есть довольно хорошее руководство по загрузке данных;http://msdn.microsoft.com/en-us/library/dd425070(v=sql.100).aspx

Редактировать: Что касается дальнейшего примера GenericListDataReader, посетите следующий сайт;http://www.csvreader.com/posts/generic_list_datareader.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...