Эффективная вставка нескольких записей в oracle db с использованием клиента Oracle - PullRequest
1 голос
/ 03 октября 2011

У меня есть приложение C # -WCF / Winforms. Оно вставляет более 450 000 записей плюс в промежуточную таблицу в базе данных Oracle, используя Oracle Client API, и в сохраненный процесс с простым запросом на вставку.Вставка записей в БД занимает около 15 минут, а иногда и записи тоже не вставляются… что дает всевозможные ошибки тайм-аута на стороне wcf.Есть ли эффективный способ сделать эти вставки?

Спасибо за чтение.

Вот мой код, который делает пакетную вставку:

OracleTransaction tran = null; 
UpdateRowSource oldURS = this.cmd.UpdatedRowSource; 
OracleCommand oldCmd = this.dbAdapter.InsertCommand; 
int oldUBS = this.dbAdapter.UpdateBatchSize; 
try 
{ 
    SetOutputParams(); 
    this.OpenDBConnection(); 
    tran = this.dbConn.BeginTransaction(); 
    this.cmd.Transaction = tran; 
    this.cmd.UpdatedRowSource = UpdateRowSource.OutputParameters; 
    this.dbAdapter.InsertCommand = this.cmd; 
    this.dbAdapter.UpdateBatchSize = size; 
    this.dbAdapter.Update(data); 
    tran.Commit(); 
    SetOutputParamValues(); 
} 
catch (OracleException ex) 
{ 
    if (tran != null) { 
        tran.Rollback(); 
    } 
    throw; 
} 
finally 
{ 
    this.CloseDBConnection(); 
    this.cmd.Parameters.Clear(); 
    this.cmd.UpdatedRowSource = oldURS; 
    this.dbAdapter.InsertCommand = oldCmd; 
    this.dbAdapter.UpdateBatchSize = oldUBS; 
} 

}

Ответы [ 3 ]

1 голос
/ 04 октября 2011

Самый быстрый способ загрузки данных в таблицу - это datapump (утилита impdp). Другой быстрый способ - SQL * Loader.

Если вы хотите придерживаться C #, изучите массовые операции. Моя гугл карма нашла следующие примеры

0 голосов
/ 04 сентября 2012

Я вставляю много данных в базу данных Oracle, расположенную в Австралии, далеко от того места, где я запускаю клиентское приложение на C #.

Вот краткое изложение того, как я это делаю.Меня поражает, как быстро я вставляю сотни тысяч записей быстро, используя привязку массива.

Это не точный код, но вы поняли:

using System.Data.OleDb;

int numRecords = 2;
int[] DISTRIBNO = new int[numRecords];
DISTRIBNO[0] = 100;
DISTRIBNO[1] = 101;

string sql = "INSERT INTO Distributors (distribno) VALUES (:DISTRIBNO)";
cnn = new Oracle.DataAccess.Client.OracleConnection(conString);
cnn.Open();

using (Oracle.DataAccess.Client.OracleCommand cmd = cnn.CreateCommand())
{
    cmd.CommandText = sql;
    cmd.CommandType = CommandType.Text;
    cmd.BindByName = true;
    // To use ArrayBinding, we need to set ArrayBindCount                
    cmd.ArrayBindCount = numRecords;
    cmd.CommandTimeout = 0;

    cmd.Parameters.Add(
              ":DISTRIBNO", 
              Oracle.DataAccess.Client.OracleDbType.Int32, 
              BR_VOLMONTH,
              ParameterDirection.Input);

    cmd.ExecuteNonQuery();
}//using

Карлос Мериге.

0 голосов
/ 13 июня 2012

Я часто использовал SQL * Loader из C # для массовой загрузки записей на сцену.

Мясо кода выглядит так:

public string RunSqlLdr(string user, string password, string dsn, string fileNameCtl, string fileNameLog)
{
    // Redirect both streams so we can write/read them.
    var cmdProcessInfo = new System.Diagnostics.ProcessStartInfo("cmd.exe")
    {
        RedirectStandardInput = true,
        RedirectStandardOutput = true,
        UseShellExecute = false
    };

    // Start the process. 
    var process = System.Diagnostics.Process.Start(cmdProcessInfo);

    // Issue the sqlldr command and exit.
    process.StandardInput.WriteLine("cd " + _directoryPath);
    process.StandardInput.WriteLine("sqlldr " + user + "/" + password + "@" + dsn + " control=" + fileNameCtl + " log=" + fileNameLog);
    process.StandardInput.WriteLine("exit");

    // Read all the output generated from it.
    var output = process.StandardOutput.ReadToEnd();
    process.Dispose();

    return output;
}

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

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