zoukankan      html  css  js  c++  java
  • Oracle的OracleBulkCopy不支持事务处理

    在进行OracleBulkCopy批量数据导入的过程中使用事务后抛出了异常,

    没使用事务时可以正确批量导入,

    ORA-12154:无法解析指定的连接字符串,

    但是TNS配置肯定是没有错的,

    难道是ConnectionString不是这样写了,执行事务时发生了变化,

    还有:


    //暂时发现oracle的bulkCopy不支持事务处理

    using (OracleBulkCopy bulkCopy = new OracleBulkCopy(conn,OracleBulkCopyOptions.UseInternalTransaction))

    如果不支持事务,这个OracleBulkCopyOptions.UseInternalTransaction怎么解释。

      1 private void button2_Click(object sender, EventArgs e)
      2 {
      3 OpenFileDialog afd = new OpenFileDialog();
      4 if (afd.ShowDialog() != System.Windows.Forms.DialogResult.OK)
      5 {
      6 return;
      7 }
      8 string fileName = afd.FileName;
      9 if (Path.GetExtension(fileName) != ".csv")
     10 {
     11 MessageBox.Show("文件名后缀必须是.csv");
     12 return;
     13 }
     14 DataTable table = new DataTable();
     15 using (Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
     16 using (StreamReader sr = new StreamReader(stream, Encoding.Default))
     17 {
     18 string firstline = sr.ReadLine();
     19 string line;
     20 
     21 
     22 #region 把创建的列加入表的列集合中
     23 //Id
     24 DataColumn column = new DataColumn();
     25 column.ColumnName = "Id";
     26 column.DataType = System.Type.GetType("System.Int32");
     27 table.Columns.Add(column);
     28 //MobileNumber
     29 column = new DataColumn();
     30 column.ColumnName = "MobileNumber";
     31 column.DataType = System.Type.GetType("System.String");
     32 column.MaxLength = 10;
     33 table.Columns.Add(column);
     34 //MobileArea
     35 column = new DataColumn();
     36 column.ColumnName = "MobileArea";
     37 column.DataType = System.Type.GetType("System.String");
     38 column.MaxLength = 30;
     39 table.Columns.Add(column);
     40 //MobileType
     41 column = new DataColumn();
     42 column.ColumnName = "MobileType";
     43 column.DataType = System.Type.GetType("System.String");
     44 column.MaxLength = 20;
     45 table.Columns.Add(column);
     46 //AreaCode
     47 column = new DataColumn();
     48 column.ColumnName = "AreaCode";
     49 column.DataType = System.Type.GetType("System.String");
     50 column.MaxLength = 10;
     51 table.Columns.Add(column);
     52 //PostCode
     53 column = new DataColumn();
     54 column.ColumnName = "PostCode";
     55 column.DataType = System.Type.GetType("System.String");
     56 column.MaxLength = 8;
     57 table.Columns.Add(column);
     58 #endregion
     59 
     60 while ((line = sr.ReadLine()) != null)
     61 {
     62 string[] mobileMsg = line.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
     63 int Id = Convert.ToInt32(mobileMsg[0]);
     64 string MobileNumber = mobileMsg[1].Trim('"');
     65 string MobileArea = mobileMsg[2].Trim('"');
     66 string MobileType = mobileMsg[3].Trim('"');
     67 string AreaCode = mobileMsg[4].Trim('"');
     68 string PostCode = mobileMsg[5].Trim('"');
     69 //创建行,把行加入表的行集合中
     70 DataRow row = table.NewRow();
     71 row["Id"] = Id;
     72 row["MobileNumber"] = MobileNumber;
     73 row["MobileArea"] = MobileArea;
     74 row["MobileType"] = MobileType;
     75 row["AreaCode"] = AreaCode;
     76 row["PostCode"] = PostCode;
     77 table.Rows.Add(row);
     78 }
     79 }
     80 
     81 int i = table.Rows.Count;
     82 Stopwatch sw = new Stopwatch();
     83 sw.Start();
     84 using (OracleConnection conn = new OracleConnection())//连接
     85 {
     86 conn.ConnectionString = @"Data Source=(DESCRIPTION =
     87 (ADDRESS_LIST =
     88 (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.117)(PORT = 1521))
     89 )
     90 (CONNECT_DATA =
     91 (SERVER = DEDICATED)
     92 (SERVICE_NAME = orcl.192.168.1.117)
     93 ))
     94 );User Id=scott;Password=abcd5226584;";
     95 conn.Open();
     96 using (OracleTransaction tx = conn.BeginTransaction())//启动事务
     97 using (OracleBulkCopy bulkCopy = new OracleBulkCopy(conn,OracleBulkCopyOptions.UseInternalTransaction))
     98 {
     99 bulkCopy.DestinationTableName = "T_MOBILE";
    100 foreach (DataColumn column in table.Columns)
    101 {
    102 bulkCopy.ColumnMappings.Add(column.ColumnName, column.ColumnName);//源列名->目标列名
    103 }
    104 try //如果发生异常就回滚
    105 {
    106 bulkCopy.WriteToServer(table);//把table表写入数据库表中
    107 tx.Commit();
    108 }
    109 catch (Exception ex)
    110 {
    111 tx.Rollback();
    112 throw new Exception(ex.Message);
    113 }
    114 }
    115 sw.Stop();
    116 MessageBox.Show("耗时:" + sw.ElapsedMilliseconds + "");
    117 }
    118 }
    119 }
    错误代码:OracleBulkCopy进行事务处理的
  • 相关阅读:
    Unity3D使用OpenFileDialog后崩溃
    JS定时器
    如果把我剥得一文不名丢在沙漠的中央,只要一行驼队经过———我就可以重建整个商业帝国
    软件开发架构
    C#对象序列化与反序列化
    我的作品们
    fread 不能读取最后一个数据块
    for循环中的i++和++i
    MOS管不能关断的原因!!!
    AD16 快速原理图封装导出
  • 原文地址:https://www.cnblogs.com/adolphyang/p/4670500.html
Copyright © 2011-2022 走看看