Oracle中对超长内容的处理,避免出现can bind a LONG value only for insert into a LONG column错误

8 篇文章 0 订阅
7 篇文章 0 订阅

错误使用了该行代码:

paramList.Add( new  OracleParameter( " : "   +  field, val));

 


猜想可能是由于这行代码的问题导致,因此修改参数化的Oracle参数变量代码为另外一个种指定对象类型的方式:

OracleParameter a  =   new  OracleParameter( " : "   +  field, OracleType.Clob, val.ToString().Length);
                        a.Value  =  val;
                        paramList.Add(a);
验证通过,发现再长的内容,写入也是正常的,不会出错和出现的截断乱码。由于第一种忽略了Oracle参数类型,就是为了适应各种类型对象的参数化构造,实现统一添加参数化内容的,由于超长的字符内容会出现问题,因此只好修改基类操作的添加参数代码,添加一个条件分支作为处理。调整后的插入代码如下(更新代码类似操作):

view plaincopy to clipboardprint?
public bool Insert(Hashtable recordField, string targetTable, DbTransaction trans)  
        {  
            bool result = false;  
            string fields = ""; // 字段名  
            string vals = ""; // 字段值  
            if ( recordField == null || recordField.Count < 1 )  
            {  
                return result;  
            }  
            List<OracleParameter> paramList = new List<OracleParameter>();  
            IEnumerator eKeys = recordField.Keys.GetEnumerator();  
            while ( eKeys.MoveNext() )  
            {  
                string field = eKeys.Current.ToString();  
                fields += field + ",";  
                if (!string.IsNullOrEmpty(seqField) && !string.IsNullOrEmpty(seqName)  
                    && (field.ToUpper() == seqField.ToUpper()))  
                {  
                    vals += string.Format("{0}.NextVal,", seqName);  
                }  
                else 
                {  
                    vals += string.Format(":{0},", field);  
                    object val = recordField[eKeys.Current.ToString()];  
                    if (val.ToString().Length >= 4000)  
                    {  
                        OracleParameter a = new OracleParameter(":" + field, OracleType.Clob, val.ToString().Length);  
                        a.Value = val;  
                        paramList.Add(a);  
                    }  
                    else 
                    {  
                        paramList.Add(new OracleParameter(":" + field, val));  
                    }  
                }  
            }  
            fields = fields.Trim(',');//除去前后的逗号  
            vals = vals.Trim(',');//除去前后的逗号  
            string sql = string.Format("INSERT INTO {0} ({1}) VALUES ({2})", targetTable, fields, vals);  
            Database db = DatabaseFactory.CreateDatabase();  
            DbCommand command = db.GetSqlStringCommand(sql);  
            command.Parameters.AddRange(paramList.ToArray());  
            if ( trans != null )  
            {  
                result = db.ExecuteNonQuery(command, trans) > 0;  
            }  
            else 
            {  
                result = db.ExecuteNonQuery(command) > 0;  
            }  
            return result;  
        } 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xinma/archive/2010/02/05/5291215.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值