powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Нужна помощь - разное поведение OleDbAdapter на локальном и удалённом сервере
10 сообщений из 10, страница 1 из 1
Нужна помощь - разное поведение OleDbAdapter на локальном и удалённом сервере
    #38743589
iDotNetCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток. Прошу опытных разработчиков помочь в решении проблемы.

Есть интернет-магазин ASP.NET MVC 4

Суть проблемы - есть метод контроллера, который принимает excel файл, читает из него строки и заносит в базу данных. То есть по сути это модуль импорта товаров в интернет магазин из Excel файла. Проблема в том, что когда я загружаю excel файл в веб-приложении на локальном development сервере, то удаётся прочитать все имеющиеся товары в файле. Когда этот же файл загружаю в это же приложение, но развернутое на удалённом сервере(smarterasp.net хостер, если что), то из файла читается только 31648 товаров(всего 91246 вроде).

Привожу сам код метода:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
// import excel file
        [HttpPost]
        public ActionResult Excel()
        {
            int supplierId = Int32.Parse(Request.Params.Get("SupplierId"));
 
            if (Request.Files[0] != null && db.Suppliers.FirstOrDefault(x => x.Id == supplierId) != null)
            {
                string extension = System.IO.Path.GetExtension(Request.Files[0].FileName); // определяем расширение пришедшего файла
 
                if (extension.ToLower() != ".xls" && extension.ToLower() != ".xlsx") // проверяем excel файл ли был предоставлен
                {
                    TempData["Message"] = "Предоставлен файл не подходящего расширения";
                    return RedirectToAction("Index");
                }
 
                string path1 = string.Format("{0}/{1}", Server.MapPath("~/Temp"), Request.Files[0].FileName.Replace(Request.Files[0].FileName, Request.Files[0].FileName + DateTime.Now.Millisecond) + extension); // определяем серверный путь к папке Temp + имя файла
                if (System.IO.File.Exists(path1)) // если файл существует, то удаляем его
                    try
                    {
                        System.IO.File.Delete(path1);
                    }
                    catch (Exception)
                    {
                        TempData["Message"] = "Файл уже существует. Переименуйте файл и попробуйте снова";
                        RedirectToAction("Index");
                    }
 
                Request.Files[0].SaveAs(path1); // сохраняем файл, соответсвенно можем позже к нему обратиться по path1
 
                string connectionString;
 
                if (extension.ToLower() == ".xls")
                {
                    connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=Excel 8.0;", path1);
                }
                else
                {
                    connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}; Extended Properties=Excel 12.0;", path1);
                }
 
                try
                {
                   // узнаём имя первого листа в файле
                    var objConn = new OleDbConnection(connectionString);
                    objConn.Open();
                    var dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                    string worksheetName = dt.Rows[0]["TABLE_NAME"].ToString();                  
 
 
 
                    var adapter = new OleDbDataAdapter("SELECT * FROM [" + worksheetName + "]", connectionString);                    
                    var ds = new DataSet();
                    ds.Tables.Add("Products");
                    adapter.Fill(ds, "Products");
                    int addedProducts = 0;
                    var products = new List<Product>();
                    var linesReaded = 0;
 
                    foreach (var dataRow in ds.Tables["Products"].AsEnumerable())
                    {
                        linesReaded++;
 
                        try
                        {
                            products.Add(new Product
                            {
                                Manufacturer = String.IsNullOrEmpty(dataRow.ItemArray[0].ToString()) || dataRow.ItemArray[0] == null ? "Unknown" : dataRow.ItemArray[0].ToString(),
                                Name = String.IsNullOrEmpty(dataRow.ItemArray[1].ToString()) || dataRow.ItemArray[1] == null ? "Unknown" : dataRow.ItemArray[1].ToString(),
                                PartNumber = String.IsNullOrEmpty(dataRow.ItemArray[2].ToString()) || dataRow.ItemArray[2] == null ? "Unknown" : dataRow.ItemArray[2].ToString(),
                                SupplierId = supplierId,
                                Quantity = dataRow.ItemArray[3].ToString().Contains(',') ||
                                    dataRow.ItemArray[3].ToString().Contains('.') ||
                                    String.IsNullOrEmpty(dataRow.ItemArray[3].ToString())
                                        ? 15 : int.Parse(dataRow.ItemArray[3].ToString().Replace("<", "").Replace(">", "").Replace(".", ",")),
                                Price = Decimal.Parse(dataRow.ItemArray[4].ToString().Replace(".", ","))
                            });
 
                            if (products.Count == 1000)
                            {
                                addedProducts += products.Count;
                                db.Products.AddRange(products);
                                db.SaveChanges();
                                products = null;
                                GC.Collect();
                                products = new List<Product>();
                            }
                        }
                        catch (Exception e)
                        {
                        }
                    }
                    db.Products.AddRange(products);
                    addedProducts += products.Count;
                    db.SaveChanges();
 
                    objConn.Close();
                    objConn.Dispose();
                    dt.Dispose();
                    //ClearTempDir();
 
                    TempData["Message"] = "Импорт успешно произведён. Добавлено - " + addedProducts + " товаров. Проработано - " + linesReaded + " Всего записей в файле - " + summuryCount;
 
 
                }
                catch (Exception exception)
                {
                    OleDbConnection.ReleaseObjectPool();
 
                    TempData["Message"] =
                        "Операция импорта завершена с ошибкой. Предоставлен файл неподходящей струтуры";
                }
 
                return RedirectToAction("Index");
 
 
            }
 
            TempData["Message"] = "Ошибка в предоставленных данных. Список товаров не был обновён";
 
            return RedirectToAction("Index");
 
        }



Код сейчас немного грязный т.к. уже кучу костылей придумывал. Но этот код на локальном читает все строки из excel, а на удалённом только треть.
То есть грубо говоря OleDbAdapter почему-то недозаполняется.

Подскажите, куда копать?
...
Рейтинг: 0 / 0
Нужна помощь - разное поведение OleDbAdapter на локальном и удалённом сервере
    #38743598
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема, скорее, в битности драйвера. В топку Microsoft.Jet.OLEDB. Open XML SDK 2.5 for Microsoft Office. Вот пример http://codearticles.ru/articles/2419
...
Рейтинг: 0 / 0
Нужна помощь - разное поведение OleDbAdapter на локальном и удалённом сервере
    #38746368
iDotNetCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МСУ, спасибо большое. Теперь на парсинг xlsx испльзую предложенную вами библиотеку.

Сначала пообщался с хостером. Он мне сказал, что это связано с тем, что я превышаю выделенный на мой сайт объём оперативной памяти из пула. Поэтому якобы коллекция обрезается. Вообщем переделал парсин на библиотеку Open XML SDK 2.5 - читает весь файл, но долго. Порядком 100 000 товаров - около 25-30 минут.

Кстати проблема только с xlsx. xls читает без проблем и на удалённом используя OleDB

Вообщем что это было я так и не понял
...
Рейтинг: 0 / 0
Нужна помощь - разное поведение OleDbAdapter на локальном и удалённом сервере
    #38746379
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iDotNetCoderOpen XML SDK 2.5 - читает весь файл, но долго. Порядком 100 000 товаров - около 25-30 минут.
Сказки. Open XML SDK читает ничуть не медленнее, чем через драйвера. Ты, видимо, парсишь данные неоптимизированно. Выкладывай код и пример файла.
...
Рейтинг: 0 / 0
Нужна помощь - разное поведение OleDbAdapter на локальном и удалённом сервере
    #38746392
iDotNetCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
        // import excel file
        [HttpPost]
        public ActionResult Excel()
        {
            int supplierId = Int32.Parse(Request.Params.Get("SupplierId"));

            if (Request.Files[0] != null && db.Suppliers.FirstOrDefault(x => x.Id == supplierId) != null)
            {
                string extension = System.IO.Path.GetExtension(Request.Files[0].FileName); // определяем расширение пришедшего файла

                if (extension.ToLower() != ".xls" && extension.ToLower() != ".xlsx") // проверяем excel файл ли был предоставлен
                {
                    TempData["Message"] = "Предоставлен файл не подходящего расширения";
                    return RedirectToAction("Index");
                }

                string path1 = string.Format("{0}/{1}", Server.MapPath("~/Temp"), Request.Files[0].FileName.Replace(Request.Files[0].FileName, Request.Files[0].FileName + DateTime.Now.Millisecond) + extension); // определяем серверный путь к папке Temp + имя файла
                if (System.IO.File.Exists(path1)) // если файл существует, то удаляем его
                    try
                    {
                        System.IO.File.Delete(path1);
                    }
                    catch (Exception)
                    {
                        TempData["Message"] = "Файл уже существует. Переименуйте файл и попробуйте снова";
                        RedirectToAction("Index");
                    }

                Request.Files[0].SaveAs(path1); // сохраняем файл, соответсвенно можем позже к нему обратиться по path1

                try
                {
                    if (extension.ToLower() == ".xls")
                    {
                        HSSFWorkbook workBookXLS;
                        using (FileStream file = new FileStream(path1, FileMode.Open, FileAccess.Read))
                        {
                            workBookXLS = new HSSFWorkbook(file);
                        }
                        ISheet sheet = workBookXLS.GetSheetAt(0);

                        int addedProducts = 0;
                        var products = new List<Product>();
                        int rowsCount = sheet.LastRowNum;

                        int row = 0;
                        while (row < rowsCount)
                        {
                            row++;
                            if (sheet.GetRow(row) != null) //null is when the row only contains empty cells 
                            {
                                try
                                {
                                    products.Add(new Product
                                    {
                                        Manufacturer = String.IsNullOrEmpty(sheet.GetRow(row).GetCell(0).StringCellValue) || sheet.GetRow(row).GetCell(0).StringCellValue == null ? "Unknown" : sheet.GetRow(row).GetCell(0).StringCellValue,
                                        Name = String.IsNullOrEmpty(sheet.GetRow(row).GetCell(1).StringCellValue) || sheet.GetRow(row).GetCell(1).StringCellValue == null ? "Unknown" : sheet.GetRow(row).GetCell(1).StringCellValue,
                                        PartNumber = String.IsNullOrEmpty(sheet.GetRow(row).GetCell(2).StringCellValue) || sheet.GetRow(row).GetCell(2).StringCellValue == null ? "Unknown" : sheet.GetRow(row).GetCell(2).StringCellValue,
                                        SupplierId = supplierId,
                                        Quantity = sheet.GetRow(row).GetCell(3).ToString().Contains(',') ||
                                            sheet.GetRow(row).GetCell(3).ToString().Contains('.') ||
                                            String.IsNullOrEmpty(sheet.GetRow(row).GetCell(3).ToString())
                                                ? 15 : int.Parse(sheet.GetRow(row).GetCell(3).ToString().Replace("<", "").Replace(">", "").Replace(".", ",")),
                                        Price = Decimal.Parse(sheet.GetRow(row).GetCell(4).ToString().Replace(".", ","))
                                    });


                                    if (row == rowsCount - 1)
                                    {
                                        addedProducts += products.Count;
                                        db.Products.AddRange(products);
                                        db.SaveChanges();
                                        products = null;
                                        GC.Collect();
                                        products = new List<Product>();
                                        return RedirectToAction("Index");
                                    }

                                    if (products.Count == 1000)
                                    {
                                        addedProducts += products.Count;
                                        db.Products.AddRange(products);
                                        db.SaveChanges();
                                        products = null;
                                        GC.Collect();
                                        products = new List<Product>();
                                    }
                                }
                                catch (Exception e)
                                {
                                    continue;
                                }
                            }
                        }
                        db.Products.AddRange(products);
                        addedProducts += products.Count;
                        db.SaveChanges();

                        ClearTempDir();

                        TempData["Message"] = "Импорт успешно произведён. Добавлено - " + addedProducts +
                                              " товаров. Всего записей в файле - " + rowsCount;
                    }
                    else
                    {
                        var dataset = ExcelParser.Read(System.IO.File.ReadAllBytes(path1));
                        var table = dataset.Tables.OfType<DataTable>().First();

                        int addedProducts = 0;
                        var products = new List<Product>();

                        foreach (DataRow dataRow in table.Rows)
                        {
                            try
                            {
                                products.Add(new Product
                                {
                                    Manufacturer = String.IsNullOrEmpty(dataRow.ItemArray[0].ToString()) || dataRow.ItemArray[0] == null ? "Unknown" : dataRow.ItemArray[0].ToString(),
                                    Name = String.IsNullOrEmpty(dataRow.ItemArray[1].ToString()) || dataRow.ItemArray[1] == null ? "Unknown" : dataRow.ItemArray[1].ToString(),
                                    PartNumber = String.IsNullOrEmpty(dataRow.ItemArray[2].ToString()) || dataRow.ItemArray[2] == null ? "Unknown" : dataRow.ItemArray[2].ToString(),
                                    SupplierId = supplierId,
                                    Quantity = dataRow.ItemArray[3].ToString().Contains(',') ||
                                        dataRow.ItemArray[3].ToString().Contains('.') ||
                                        String.IsNullOrEmpty(dataRow.ItemArray[3].ToString())
                                            ? 15 : int.Parse(dataRow.ItemArray[3].ToString().Replace("<", "").Replace(">", "").Replace(".", ",")),
                                    Price = Decimal.Parse(dataRow.ItemArray[4].ToString().Replace(".", ","))
                                });

                                if (products.Count == 1000)
                                {
                                    addedProducts += products.Count;
                                    db.Products.AddRange(products);
                                    db.SaveChanges();
                                    products = null;
                                    GC.Collect();
                                    products = new List<Product>();
                                }
                            }
                            catch (Exception e)
                            {
                                continue;
                            }

                        }
                        db.Products.AddRange(products);
                        addedProducts += products.Count;
                        db.SaveChanges();

                        ClearTempDir();

                        TempData["Message"] = "Импорт успешно произведён. Добавлено - " + addedProducts;
                    }
                }
                catch (Exception exception)
                {
                    TempData["Message"] = "Операция импорта завершена с ошибкой. Предоставлен файл неподходящей струтуры";
                }
                return RedirectToAction("Index");
            }
            TempData["Message"] = "Ошибка в предоставленных данных. Список товаров не был обновён";
            return RedirectToAction("Index");
        }




Юзинги:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using PartsStore.Addons;
using PartsStore.Models;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;



И класс ExcelParser
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
    public class ExcelParser
    {
        public static void Write(Stream stream, DataSet dataset)
        {
            using (var workbook = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook))
            {
                var workbookPart = workbook.AddWorkbookPart();
                workbook.WorkbookPart.Workbook = new Workbook();
                workbook.WorkbookPart.Workbook.Sheets = new Sheets();

                foreach (DataTable table in dataset.Tables)
                {
                    var sheetPart = workbook.WorkbookPart.AddNewPart<WorksheetPart>();
                    var sheetData = new SheetData();
                    sheetPart.Worksheet = new Worksheet(sheetData);

                    var sheets = workbook.WorkbookPart.Workbook.GetFirstChild<Sheets>();
                    string relationshipId = workbook.WorkbookPart.GetIdOfPart(sheetPart);
                    uint sheetId = sheets.Elements<Sheet>().Count() > 0 ? sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1 : 1;

                    var sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = table.TableName };
                    sheets.Append(sheet);

                    var headerRow = new Row();

                    var columns = new List<string>();
                    foreach (System.Data.DataColumn column in table.Columns)
                    {
                        columns.Add(column.ColumnName);

                        var cell = new Cell();
                        cell.DataType = CellValues.String;
                        cell.CellValue = new CellValue(column.ColumnName);
                        headerRow.AppendChild(cell);
                    }


                    sheetData.AppendChild(headerRow);

                    foreach (DataRow dsrow in table.Rows)
                    {
                        var newRow = new Row();
                        foreach (String col in columns)
                        {
                            var cell = new Cell();
                            cell.DataType = CellValues.String;
                            cell.CellValue = new CellValue(dsrow[col].ToString());
                            newRow.AppendChild(cell);
                        }

                        sheetData.AppendChild(newRow);
                    }

                }
            }
        }

        public static DataSet Read(byte[] fileBody, params string[] sheetNames)
        {
            using (var stream = new MemoryStream(fileBody))
            {
                return Parse(stream, sheetNames);
            }
        }

        public static DataSet Parse(Stream fileStream, params string[] sheetNames)
        {
            var dataset = new DataSet();

            using (var document = SpreadsheetDocument.Open(fileStream, false))
            {
                var workbookPart = document.WorkbookPart;
                var sheets = document.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>();

                foreach (var sheet in sheets)
                {
                    if (sheetNames == null || sheetNames.Count() == 0 || sheetNames.Any(name => string.Equals(name, sheet.Name, StringComparison.OrdinalIgnoreCase)))
                    {
                        var worksheetPart = document.WorkbookPart.GetPartById(sheet.Id.Value) as WorksheetPart;

                        if (worksheetPart != null)
                        {
                            var workSheet = worksheetPart.Worksheet;
                            var sheetData = workSheet.GetFirstChild<SheetData>();

                            var totalRows = new List<List<string>>();
                            int maxCol = Fetch(document, sheetData, totalRows);

                            var table = ConvertList(totalRows, maxCol);
                            table.TableName = sheet.Name;
                            dataset.Tables.Add(table);
                        }
                    }
                }
            }

            return dataset;
        }

        private static int Fetch(SpreadsheetDocument document, SheetData sheetData, List<List<string>> totalRows)
        {
            int maxCol = 0;

            foreach (var row in sheetData.Elements<Row>())
            {
                string value = null;
                while (totalRows.Count < row.RowIndex - 1)
                {
                    var emptyRowValues = new List<string>();
                    for (int i = 0; i < maxCol; i++)
                    {
                        emptyRowValues.Add(string.Empty);
                    }
                    totalRows.Add(emptyRowValues);
                }


                var tempRowValues = new List<string>();
                foreach (var cell in row.Elements<Cell>())
                {
                    if (cell != null)
                    {
                        value = GetCellValue(document, cell);
                    }

                    int i = Convert.ToInt32(cell.CellReference.ToString().ToCharArray().First() - 'A');

                    while (tempRowValues.Count < i)
                    {
                        tempRowValues.Add(string.Empty);
                    }
                    tempRowValues.Add(value);
                }

                maxCol = Process(tempRowValues, totalRows, maxCol);
            }

            return maxCol;
        }

        private static int Process(List<string> tempRows, List<List<string>> totalRows, int MaxCol)
        {
            if (tempRows.Count > MaxCol)
            {
                MaxCol = tempRows.Count;
            }

            totalRows.Add(tempRows);
            return MaxCol;
        }

        private static DataTable ConvertList(List<List<string>> totalRows, int maxCol)
        {
            var table = new DataTable();
            for (int i = 0; i < maxCol; i++)
            {
                table.Columns.Add();
            }
            foreach (List<string> row in totalRows)
            {
                while (row.Count < maxCol)
                {
                    row.Add(string.Empty);
                }
                table.Rows.Add(row.ToArray());
            }
            return table;
        }

        private static string GetCellValue(SpreadsheetDocument document, Cell cell)
        {
            var stringTablePart = document.WorkbookPart.SharedStringTablePart;
            string value = cell.CellValue != null ? cell.CellValue.InnerXml : string.Empty;

            if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
            {
                return stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText;
            }
            else
            {
                return value;
            }
        }
    }




xls кстати и забыл уже - перевёл на NPOI - работает быстро. Пробывал xlsx перевети тоже на NPOI но также получал не все товары из файла на удалённом. То есть проблема сейчас во второй части где читаю xlsx через Open XML SDK
...
Рейтинг: 0 / 0
Нужна помощь - разное поведение OleDbAdapter на локальном и удалённом сервере
    #38746396
iDotNetCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот собственно файл
https://yadi.sk/d/p7UYJNdNbUK46
...
Рейтинг: 0 / 0
Нужна помощь - разное поведение OleDbAdapter на локальном и удалённом сервере
    #38746529
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iDotNetCoder, да, ты прав. Тормоза в методе GetCellValue(SpreadsheetDocument document, Cell cell). Там идет постоянно обращение к OpenXmlElementList и заново фетчится эта IEnumerable.
Переделал немного метод на GetCellValue(SpreadsheetDocument document, Cell cell, IList<OpenXmlElement> elements). Теперь летает. В http://codearticles.ru/articles/2419 тоже поправил. Пользуйся.

P.S. Спасибо за дельное замечание. Вина была не в Open XML, а в моём криворучии

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
var timer = Stopwatch.StartNew();

var body = File.ReadAllBytes("мажор.xlsx");
var ds = ExcelParser.Read(body, "454");

timer.Stop();

Console.WriteLine(timer.ElapsedMilliseconds); // 3.2 секунды, ~100 тыс записей
...
Рейтинг: 0 / 0
Нужна помощь - разное поведение OleDbAdapter на локальном и удалённом сервере
    #38746600
iDotNetCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ОГРОМАДНЕЙШЕЕ СПАСИБО!!!!!!!!!!!!!!!!!!!)))))))))))))))))))))))
...
Рейтинг: 0 / 0
Нужна помощь - разное поведение OleDbAdapter на локальном и удалённом сервере
    #38746619
codearticles.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iDotNetCoder, это тебе спасибо, что нашел дырку в коде :)

P.S. Только что выложил на сайте еще более оптимизированный ExcelParser, скорость ещё выросла на 6% (можно скачать). То есть сейчас твой файл процессится за 2.9-3 секунды на моём железе. Дальше оптимизировать код уже сложно, разве что начать использовать SAX ридеры (OpenXmlReader, Open XML SDK SAX). Но там максимум что можно выжать, так это еще +2%. Так что не буду лезть в дебри, всё работает предельно просто, типизированно и шустро. Да уж, 30 минут против 3 секунд - это просто эпично :)
...
Рейтинг: 0 / 0
Нужна помощь - разное поведение OleDbAdapter на локальном и удалённом сервере
    #38747201
iDotNetCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
codearticles.ru, очень полезный у тебя сайт - взял на вооружение наряду с metanit и stackoverflow
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Нужна помощь - разное поведение OleDbAdapter на локальном и удалённом сервере
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]