`
啸笑天
  • 浏览: 3461224 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

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

阅读更多

错误使用了该行代码:

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

分享到:
评论

相关推荐

    Android 出现“Can’t bind to local 8602 for debugger”错误的解决方法

    Android 出现“Can’t bind to local 8602 for debugger”错误的解决方法 为了适应Android5.0的开发,把JDK升级到了1.7,然后在ADT中想调试一下程序(我连接的真机),结果报错如下: [2015-04-23 15:31:37 - ddms]...

    Android 出现“Can't bind to local 8602 for debugger”错误的解决方法

    "Android 出现“Can't bind to local 8602 for debugger”错误的解决方法" Android 开发中经常会遇到一些错误,今天我们就来解决一个常见的错误:“Can't bind to local 8602 for debugger”。这个错误通常发生在...

    BIND9 中文手册

    BIND9是互联网域名系统(DNS)服务器软件,广泛用于管理和解析域名。中文手册的提供是为了帮助中文用户更好地理解和操作这个强大的系统。以下是BIND9的一些关键知识点: 1. **DNS概念**:BIND9作为DNS服务器,负责...

    FFmpeg Unity Bind视频处理插件.zip

    FFmpeg Unity Bind是一款专为Unity游戏引擎设计的视频处理插件,它允许开发者在Unity环境中进行高效的视频编辑操作。FFmpeg是一个开源的跨平台多媒体框架,包含了一系列用于处理音频和视频的工具,如编码、解码、...

    insert-data-from-C-in-an-Oracle-database.rar_oracle

    例如,插入数据的SQL可能看起来像这样:“INSERT INTO table_name (column1, column2) VALUES (:1, :2)”,其中`:1`和`:2`是绑定变量,用于存储待插入的数据。 4. **绑定变量**:使用oci_bind_by_name函数将C变量...

    php mysql insert into 结合详解及实例代码

    `INSERT INTO SELECT`语句允许将从一个表中查询的结果插入到另一个表中。这两个表的结构必须匹配,即使列名不同: ```sql INSERT INTO table1 (column1, column2, ...) SELECT column1, column2, ... FROM table2; ...

    Oracle数据库OCCIDemo

    stmt-&gt;setSQL("INSERT INTO table_name (column1, column2) VALUES (:1, :2)"); stmt-&gt;bind(1, value1); stmt-&gt;bind(2, value2); stmt-&gt;executeUpdate(); ``` 4. **处理结果集**:如果执行的是SELECT语句,可以迭代...

    第十四课Oracle游标和异常处理.pptx

    Oracle数据库系统中,游标和异常处理是两个重要的概念,特别是在复杂的数据库操作和程序设计中。游标允许我们逐行处理查询结果,而异常处理则提供了对错误的捕获和处理机制,确保程序的健壮性。 首先,我们来看动态...

    Oracle 动态sql

    Oracle动态SQL是数据库编程中的一种技术,它允许在运行时构建和执行SQL语句,而不是在编译时确定。这在处理不确定的数据操作或者需要根据用户输入或程序逻辑动态生成SQL语句时非常有用。Oracle数据库提供了多种方式...

    Oracle OCI 应用,VC++中如何用ORACLE OCI实现Oracle数据库的连接和对表的访问

    Oracle OCI(Oracle Call Interface)是Oracle数据库提供的一种C语言接口,允许开发者在各种应用程序中直接与Oracle数据库交互。在VC++环境下,通过OCI接口可以实现高效、低级别的数据库操作,包括连接、查询、插入...

    Pro DNS and BIND 10 英文版

    Pro DNS and BIND guides you through the challenging array of features surrounding DNS, with a special focus on BIND, the worlds most popular DNS implementation. This book unravels the mysteries of DNS...

    Oracle 编程接口OCCI函数库增删改的实例

    Oracle编程接口(Oracle Call Interface,简称OCCI)是Oracle公司提供的C++ API,用于与Oracle数据库进行交互。这个接口提供了全面的功能,包括数据查询、事务处理、对象操作等。本实例将详细介绍如何使用OCCI进行...

    sql语句oracle中的一些运用

    例如,`INSERT INTO table_name (column1, column2) VALUES (value1, value2)`。 3. 更新(UPDATE):修改已有记录。如`UPDATE table_name SET column1 = new_value WHERE condition`。 4. 删除(DELETE):移除...

    iBATIS操作Oracle CLOB数据

    6. **性能优化**:处理CLOB数据时,注意避免一次性加载整个CLOB内容到内存中,可以分块读取或延迟加载。 7. **事务管理**:由于CLOB操作可能会涉及到较大的数据量,确保正确设置事务的隔离级别和回滚规则,以防止...

    oracle执行动态sql

    3. **错误处理**:动态 SQL 的错误处理相对复杂,需要开发者编写额外的代码来捕获和处理可能发生的异常。 综上所述,Oracle 中执行动态 SQL 的方法多样,可以根据具体的应用场景选择合适的方式。无论是使用 `...

    前端开源库-abind

    `abind` 库简化了这一过程,使得在JavaScript类中处理事件和更新视图变得更加容易。 **自动绑定的概念** 自动绑定是指当一个函数被用作事件处理器或者在其他上下文中调用时,该函数仍然能访问到定义它的对象或类的...

    bind失败的解决方案

    在 bind 操作中,还可能会出现权限原因的错误信息,例如 EACCES:地址受到保护,用户非超级用户。这是因为绑定操作需要拥有足够的权限。 四、解决 bind 操作的其他问题 在 bind 操作中,还可能会出现其他问题,...

    dns-bind处理流程介绍

    ### DNS-BIND 处理流程详解 #### 一、DNS-BIND 概述与核心组件 DNS-BIND 是一种广泛使用的域名系统 (DNS) 服务器软件,由 Internet Systems Consortium (ISC) 开发维护。它主要负责解析域名到 IP 地址,支持多种 ...

    bind9 安装配置

    Silence a BIND warning ns A 8.8.8.8 * A 8.8.8.8` 启动 BIND9 在配置完成后,需要启动 BIND9,以便提供 DNS 服务。可以使用以下命令启动 BIND9: `/etc/rc.d/named start` 到现在,一个名为 aaa.net 的域名...

Global site tag (gtag.js) - Google Analytics