2017-08-18 3 views
1

Ich arbeite derzeit an einer Anwendung, für die ich einige tausend Zeilen gleichzeitig in einer Oracle (11g) -Basis (mit ODP.NET) einfügen muss. ("Bulk-Insert-Stil")Array-Bindung mit Oracle (11g) Db und C#

Deshalb versuche ich, die Array-Bindungstechnik für Oracle-Datenbank mit ODP.net zu verwenden.

Hier ist mein Code: Ich bekomme keinen Fehler beim Ausführen, aber nichts passiert, entweder es läuft für immer.

Wenn jemand eine Vorstellung davon hat, woher das Problem kommen könnte, bitte sagen Sie mir.

Danke für Ihre Hilfe.

private static void AddDataTableToDataBase(DataTable tableLog) 
    { 
     string[] type = new string[tableLog.Rows.Count]; 
     DateTime[] timestamp = new DateTime[tableLog.Rows.Count]; 
     string[] source = new string[tableLog.Rows.Count]; 
     string[] appName = new string[tableLog.Rows.Count]; 
     string[] action = new string[tableLog.Rows.Count]; 
     string[] fileType = new string[tableLog.Rows.Count]; 
     string[] usr = new string[tableLog.Rows.Count]; 
     int?[] executionTime = new int?[tableLog.Rows.Count]; 
     string[] addMetadata = new string[tableLog.Rows.Count]; 
     string[] explanation = new string[tableLog.Rows.Count]; 


     for (int i = 0; i < tableLog.Rows.Count; i++) 
     { 
      type[i] = tableLog.Rows[i][0].ToString(); 
      timestamp[i] = (DateTime)tableLog.Rows[i][1]; 
      source[i] = tableLog.Rows[i][2].ToString(); 
      appName[i] = tableLog.Rows[i][3].ToString(); 
      action[i] = tableLog.Rows[i][4].ToString(); 
      fileType[i] = tableLog.Rows[i][5].ToString(); 
      usr[i] = tableLog.Rows[i][6].ToString(); 
      int executionTimeValue; 
      if (int.TryParse(tableLog.Rows[i][7].ToString(), out executionTimeValue)) 
       executionTime[i] = executionTimeValue; 

      addMetadata[i] = tableLog.Rows[i][8].ToString(); 
      explanation[i] = tableLog.Rows[i][9].ToString(); 
     } 
     string OracleConnectionString = ConfigurationManager.ConnectionStrings["DmsConnection"].ConnectionString; 
     (OracleConnectionString); 
     Oracle.DataAccess.Client.OracleConnection conn = new Oracle.DataAccess.Client.OracleConnection(OracleConnectionString); 
     conn.Open(); 
        Oracle.DataAccess.Client.OracleCommand cmd = conn.CreateCommand(); 
     cmd.CommandText = "INSERT INTO LOG (TYPE,TIMESTAMP,SOURCE,APPNAME,ACTION,FILETYPE,USR,EXECUTIONTIME,ADDMETADATA,EXPLANATION) VALUES (:TYPE, :TIMESTAMP, :SOURCE, :APPNAME, :ACTION, :FILETYPE, :USR, :EXECUTIONTIME, :ADDMETADATA, :EXPLANATION)"; 

     Oracle.DataAccess.Client.OracleParameter TYPE = new Oracle.DataAccess.Client.OracleParameter("TYPE", Oracle.DataAccess.Client.OracleDbType.NVarchar2, 150, "TYPE"); 
     Oracle.DataAccess.Client.OracleParameter TIMESTAMP = new Oracle.DataAccess.Client.OracleParameter("TIMESTAMP", Oracle.DataAccess.Client.OracleDbType.Date); 
     Oracle.DataAccess.Client.OracleParameter SOURCE = new Oracle.DataAccess.Client.OracleParameter("SOURCE", Oracle.DataAccess.Client.OracleDbType.NVarchar2, 150); 
     Oracle.DataAccess.Client.OracleParameter APPNAME = new Oracle.DataAccess.Client.OracleParameter("APPNAME", Oracle.DataAccess.Client.OracleDbType.NVarchar2, 150); 
     Oracle.DataAccess.Client.OracleParameter ACTION = new Oracle.DataAccess.Client.OracleParameter("ACTION", Oracle.DataAccess.Client.OracleDbType.NVarchar2, 150); 
     Oracle.DataAccess.Client.OracleParameter FILETYPE = new Oracle.DataAccess.Client.OracleParameter("FILETYPE", Oracle.DataAccess.Client.OracleDbType.NVarchar2, 150); 
     Oracle.DataAccess.Client.OracleParameter USR = new Oracle.DataAccess.Client.OracleParameter("USR", Oracle.DataAccess.Client.OracleDbType.NVarchar2, 150); 
     Oracle.DataAccess.Client.OracleParameter EXECUTIONTIME = new Oracle.DataAccess.Client.OracleParameter("EXECUTIONTIME", Oracle.DataAccess.Client.OracleDbType.Int32); 
     Oracle.DataAccess.Client.OracleParameter ADDMETADATA = new Oracle.DataAccess.Client.OracleParameter("ADDMETADATA", Oracle.DataAccess.Client.OracleDbType.Clob); 
     Oracle.DataAccess.Client.OracleParameter EXPLANATION = new Oracle.DataAccess.Client.OracleParameter("EXPLANATION", Oracle.DataAccess.Client.OracleDbType.Clob); 

     TYPE.Direction = ParameterDirection.Input; 
     TIMESTAMP.Direction = ParameterDirection.Input; 
     SOURCE.Direction = ParameterDirection.Input; 
     APPNAME.Direction = ParameterDirection.Input; 
     ACTION.Direction = ParameterDirection.Input; 
     FILETYPE.Direction = ParameterDirection.Input; 
     USR.Direction = ParameterDirection.Input; 
     EXECUTIONTIME.Direction = ParameterDirection.Input; 
     ADDMETADATA.Direction = ParameterDirection.Input; 
     EXPLANATION.Direction = ParameterDirection.Input; 

     cmd.Parameters.Add(TYPE); 
     cmd.Parameters.Add(TIMESTAMP); 
     cmd.Parameters.Add(SOURCE); 
     cmd.Parameters.Add(APPNAME); 
     cmd.Parameters.Add(ACTION); 
     cmd.Parameters.Add(FILETYPE); 
     cmd.Parameters.Add(USR); 
     cmd.Parameters.Add(EXECUTIONTIME); 
     cmd.Parameters.Add(ADDMETADATA); 
     cmd.Parameters.Add(EXPLANATION); 

     cmd.Parameters["TYPE"].Value = type; 
     cmd.Parameters["TIMESTAMP"].Value = timestamp; 
     cmd.Parameters["SOURCE"].Value = source; 
     cmd.Parameters["APPNAME"].Value = appName; 
     cmd.Parameters["ACTION"].Value = action; 
     cmd.Parameters["FILETYPE"].Value = fileType; 
     cmd.Parameters["USR"].Value = usr; 
     cmd.Parameters["EXECUTIONTIME"].Value = executionTime; 
     cmd.Parameters["ADDMETADATA"].Value = addMetadata; 
     cmd.Parameters["EXPLANATION"].Value = explanation; 

     cmd.ExecuteNonQuery(); 
     cmd.Dispose(); 
     conn.Close(); 
    } 
+0

Können Sie den Code durchgehen, um festzustellen, in welcher Zeile er stecken bleibt? Wenn Sie den Code nicht durchgehen können, können Sie dann einige Druckanweisungen hinzufügen? – davmos

+0

hey Davmos danke für deinen Kommentar. Es bleibt bei der "executeNonQuey()" Anweisung stecken. Ich habe viele verschiedene Werte für die Abfrage ausprobiert und diese ist die einzige, die keinen Fehler verursacht. – LaGranf

+0

OK, wie viele Zeilen möchten Sie einfügen? Vielleicht dauert es nur eine lange Zeit. Kannst du es mit nur einer Zeile versuchen? Wenn es immer noch nicht zurückkehrt, ist die Tabelle möglicherweise gesperrt und wartet darauf, dass diese Sperre freigegeben wird. Es kann von einem anderen Benutzer/Prozess oder vielleicht sogar von Ihnen selbst gesperrt werden, wenn Sie eine frühere Einfügung oder Aktualisierung durchgeführt und nicht ausgeführt haben! – davmos

Antwort

0

Ich fand endlich die Lösung für mein Problem.

Der obige Code funktioniert gut, das einzige Problem ist, dass ich Clob Oracle Datentyp verwende. Die interne Konvertierung von String nach Clob benötigt viel Zeit.

Ich endete die Kürzung der Saiten, die zu lang waren und jetzt funktioniert es gut und es ist sehr schnell. (Nur ein paar Sekunden, um 4000 Datensätze einzufügen).