2014-02-03 6 views
1

Дело в том, что в настоящее время я разрабатываю какое-то приложение, где мне приходится загружать данные с листа excel и сохранять его в таблице базы данных (оракул). Мне удалось выполнить этот процесс, класс OracleDataAdapterВставка большого количества данных из gridView в базу данных в малые промежутки времени

_adapter = new OracleDataAdapter(query, _conn); 
_adapter.Update(_dataTable); 

Однако это занимает много времени, чтобы сохранить данные, загруженные в GridView, как 12 минут для 100000 реестров. Затем я попробовал OracleBulkCopy, который действительно работает примерно через 10-15 секунд, но проблема в том, что он не соблюдает первичный ключ из базы данных. Я пробовал все, но он не соблюдает ограничение.

Я также попытался сделать метод вставки сам делать что-то вроде этого:

OracleCommand cmdInsert = new OracleCommand(); 
cmdInsert.CommandText = query; 
cmdInsert.Connection = DataAccess._conn; 

OracleParameter id_Filtro = new OracleParameter(); 
cmdInsert.Parameters.Add(id_Filtro); 

foreach (DataRow r in _table.Rows) 
{    
    id_Filtro.DbType = DbType.Int32; 
    id_Filtro.Value = Convert.ToInt32(r["ID_FILTRO"].ToString()); 
    id_Filtro.ParameterName = "id_Filtro "; 
    cmdInsert.ExecuteNonQuery(); 
} 

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

+0

'требуется много времени, чтобы сохранить данные, загруженные в gridView, например, 12 минут для 100000 реестров'. Возможно, вам будет интересно наблюдать [этот короткий клип] (http://www.youtube.com/watch ? v = D3Y6DnFpHCA) –

+1

BulkCopy - это правильный путь для этого тома. Лучше всего отделить свои шаги. Не загружайте его непосредственно в целевую таблицу. Загрузите его в рабочий стол, затем используйте хранимую процедуру для массажа по мере необходимости в целевой таблице. – dbugger

+0

@ dbugger, не могли бы вы рассказать мне об этом больше? – Nivde

ответ

0

OracleBulkCopy, похоже, использует аналогичную концепцию SQL * Loader (утилита Oracle для большей загрузки массовых данных). Эта утилита сделает индекс и ограничения UNUCABLE (кроме нескольких контрольных ограничений). И снова включите его после завершения.

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

Так что попробуйте подтвердить свой источник данных перед загрузкой. Процедуры также могут быть выбраны. Вы даже можете сделать загрузку BULK в таблицу temp и вставить в select ... В свою целевую таблицу.