2017-08-18 44 views
1

我当前正在研究一个应用程序,我需要在Oracle(11g)基础(使用ODP.NET)中同时插入数千行。 (“批量插入样式”)数组绑定与Oracle(11g)Db和c#

这就是为什么我试图使用ODP.net的Oracle数据库的数组绑定技术。

这里是我的代码:运行时没有错误,但没有任何反应,它永远运行。

如果有人知道问题可能来自哪里,请告诉我。

感谢您的帮助。

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

你能够逐句通过代码来确定它卡在哪一行吗?如果您无法逐句通过代码,那么您可以添加一些打印语句吗? – davmos

+0

嗨达沃斯感谢您的评论。 它卡在“executeNonQuey()”指令上。 我已经尝试了许多不同的查询值,这是唯一不会引发错误的值。 – LaGranf

+0

好吧,你试图插入多少行?也许这只是需要很长时间。你可以试一下吗?如果它仍然没有返回,也许表被锁定,并且正在等待该锁被释放。如果你已经执行了先前的插入或更新并且没有被提交,它可能被另一个用户/进程或甚至你自己锁定! – davmos

回答

0

我终于找到了解决我的问题。

上面的代码工作正常,唯一的问题是我使用Clob Oracle数据类型。从字符串到Clob的内部转换需要很长时间。

我结束了截断太长的字符串,现在它工作正常,它非常快。 (只需几秒钟即可插入4000条记录)。