2016-10-31 3 views
2

Я бы хотел использовать объемную копию sql для загрузки данных из файла *.xlsx в базу данных. Но, я столкнулся с проблемой, когда размер файла превышает примерно 1 Мб. Когда я пытаюсь открыть OleDbConnection я получаю сообщение об ошибкеНевозможно прочитать файл xlsx через OleDb размером более ~ 1mb

No error message available, result code: E_FAIL(0x80004005)

Кто-нибудь иметь представление о таком поведении?

P.S. Если размер файла меньше указанного выше, все работает так, как ожидалось.

string connString = connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0 Xml;"; 

// Create the connection object 
OleDbConnection oledbConn = new OleDbConnection(connString); 
// Open connection 
oledbConn.Open(); 
// Create OleDbCommand object and select data from worksheet 
OleDbCommand cmd = new OleDbCommand("SELECT * FROM [" + WorkSheetName + "$" + DataRange + "]", oledbConn); 
OleDbDataReader dr = cmd.ExecuteReader(); 

string ProfDbBulkCopyConnString = ConfigurationManager.ConnectionStrings["DbBulkCopyConnString"].ToString(); 
SqlBulkCopy sb = new SqlBulkCopy(ProfDbBulkCopyConnString); 
sb.ColumnMappings.Add("Status", "ActionStatus"); 
sb.ColumnMappings.Add("Process", "ProcessExec"); 
sb.DestinationTableName = "dba.Execute"; 
sb.WriteToServer(dr); 
+0

Возможно, исходный код, который вы используете для этого, может помочь ... И прочитайте [спросить], прежде чем задавать свой следующий вопрос. –

+0

@ Chomel Вот оно. Надеюсь, ничего путать. – managerger

+0

Теперь мы получаем больше информации! –

ответ

1

Просто краткое описание крепления. Для получения более подробной информации рекомендую посетить:

По существу, формата XLSX является своим родом почтового архива с кучей XML файлов. Поэтому, прежде всего, поставщик ACEOLEDB пытается распаковать все данные непосредственно в буфер памяти, но в случае, если большой поставщик файлов xlsx не может распаковать все данные в буфер памяти, и он заставил создать временный файл на жестком диске. Если у пользователя нет разрешения на папку Content.MSO на жестком диске, указанная проблема появляется. Путь к папке зависит от вашего окружения. В моем случае это C: \ Windows \ SysWOW64 \ config \ systemprofile \ AppData \ Local \ Microsoft \ Windows \ Temporary Internet Files \ Content.MSO (32-разрядный драйвер на 64-разрядном сервере Windosw Server 2008 R2). Итак, предоставите доступ к Content.MSO для пользователя «IIS AppPool \ DefaultAppPool», и проблема исчезнет.

Смежные вопросы