.NET中用OracleClient插入Clob大文本问题

.NET中用OracleClient插入Clob大文本问题

在Oracle中插入Clob数据时,当插入的数据<4K时,可以正常插入,但是>4K时,总是抱错:ORA-01704 文本太长。为了解决更大文本的插入,本人研究一下方法供参考,经测试没有问题。

 1private void button1_Click(object sender, System.EventArgs e)
 2        {
 3            // 源数据库
 4            OracleConnection wtgsConn = new OracleConnection("Data Source=wtgsktxx;User Id=wutan;Password=wutan;Integrated Security=no;");
 5            OracleCommand cmd = new OracleCommand("select wjbgwb,xmbh from awc32 where xmbh='5'",wtgsConn);
 6
 7            //目标数据库
 8            OracleConnection connect = new OracleConnection("Data Source=oratest;User Id=kttest;Password=test;Integrated Security=no;");
 9            OracleCommand lobCmd = connect.CreateCommand();
10            try
11            {
12                wtgsConn.Open();
13                connect.Open();
14                
15                // 取得 clob 字段
16                OracleDataReader dr = cmd.ExecuteReader();
17                dr.Read();
18                OracleLob readLob = ((OracleDataReader)dr).GetOracleLob(dr.GetOrdinal("wjbgwb"));
19                dr.Close();
20
21                // 为访问表定义一个游标 clobvar
22                string cmdSql = "DECLARE clobvar CLOB;";
23                cmdSql += " begin ";
24                cmdSql += " dbms_lob.createtemporary(clobvar, false, 0); :tempLob:= clobvar; ";
25                cmdSql += " end;";
26                lobCmd.CommandText = cmdSql;
27                lobCmd.Parameters.Add(new OracleParameter("tempLob", OracleType.Clob)).Direction = ParameterDirection.Output;
28                lobCmd.ExecuteNonQuery();
29                
30                // 利用事务处理(必须)
31                OracleTransaction tx = connect.BeginTransaction();
32                lobCmd.Transaction = tx;
33
34                // 定义一个临时变量
35                OracleLob tempLob = (OracleLob)lobCmd.Parameters["tempLob"].Value;
36                tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);
37
38                // 将大字段内容写入临时变量
39                int BUFFER_LENGTH = 4000;
40                long i = BUFFER_LENGTH;
41                long startIndex = 0;
42                long length = 0;
43                byte[] Buffer = new byte[BUFFER_LENGTH];
44                while(i == BUFFER_LENGTH)
45                {
46                    i = readLob.Read(Buffer,0,BUFFER_LENGTH);
47                    length += i;
48                    startIndex += i;
49                    tempLob.Write(Buffer,0,(int)i);
50                }

51                tempLob.EndBatch();
52
53                // 给参数 tempLob 负值,并执行 Insert 语句
54                lobCmd.Parameters.Add(new OracleParameter("tempLob", OracleType.Clob)).Value = tempLob;
55                lobCmd.CommandText = "insert into test_clob(wjbgwb,xmbh) values(:tempLob,'5')";
56                lobCmd.ExecuteNonQuery();
57
58                // 提交事务
59                tx.Commit();
60
61                wtgsConn.Close();
62                connect.Close();
63            }

64            catch(Exception ex)
65            {
66                wtgsConn.Close();
67                connect.Close();
68                MessageBox.Show(ex.ToString());
69            }

70        }

posted on 2005-06-10 08:53  [Fenghua]  阅读(2227)  评论(2编辑  收藏  举报

导航