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

来源:互联网 发布:用数据库统计访问次数 编辑:程序博客网 时间:2024/05/18 12:35

错误使用了该行代码:

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
原创粉丝点击