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

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

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

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

Вообщем что это было я так и не понял
...
Рейтинг: 0 / 0
14.09.2014, 20:55
    #38746379
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь - разное поведение OleDbAdapter на локальном и удалённом сервере
iDotNetCoderOpen XML SDK 2.5 - читает весь файл, но долго. Порядком 100 000 товаров - около 25-30 минут.
Сказки. Open XML SDK читает ничуть не медленнее, чем через драйвера. Ты, видимо, парсишь данные неоптимизированно. Выкладывай код и пример файла.
...
Рейтинг: 0 / 0
14.09.2014, 21:31
    #38746392
iDotNetCoder
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь - разное поведение OleDbAdapter на локальном и удалённом сервере
Код: 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
14.09.2014, 21:36
    #38746396
iDotNetCoder
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь - разное поведение OleDbAdapter на локальном и удалённом сервере
А вот собственно файл
https://yadi.sk/d/p7UYJNdNbUK46
...
Рейтинг: 0 / 0
15.09.2014, 09:50
    #38746529
codearticles.ru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь - разное поведение OleDbAdapter на локальном и удалённом сервере
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
15.09.2014, 11:02
    #38746600
iDotNetCoder
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь - разное поведение OleDbAdapter на локальном и удалённом сервере
ОГРОМАДНЕЙШЕЕ СПАСИБО!!!!!!!!!!!!!!!!!!!)))))))))))))))))))))))
...
Рейтинг: 0 / 0
15.09.2014, 11:19
    #38746619
codearticles.ru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь - разное поведение OleDbAdapter на локальном и удалённом сервере
iDotNetCoder, это тебе спасибо, что нашел дырку в коде :)

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


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