【问题标题】:Insert Into Oracle XMLTYPE column with ExecuteStoreCommand()使用 ExecuteStoreCommand() 插入 Oracle XMLTYPE 列
【发布时间】:2015-02-08 18:28:41
【问题描述】:

我有一张这样的桌子

Id (int) | xml (xmltype)

我想在这个表中插入:

string Sql = "insert into MyTable (xml) values (xmltype(:0))";
myxml = "<root>very long xml...</root>";
MyEntity.ExecuteStoreCommand(Sql, myxml);

如果 xml 很长(超过 4000 个字符),则会返回以下错误:

ORA-01461: 只能绑定 LONG 值以插入 LONG 列

我搜索了互联网,发现“myxml”应该是“clob”,但实体框架将其发送为“long”。

我们如何解决这个问题?

【问题讨论】:

    标签: .net oracle insert


    【解决方案1】:

    经过大量搜索、工作和尝试,我想出了以下解决方案:

    您不能使用 ExecuteStoreCommand() 方法来插入长度超过 4K 的字符串。

    为了添加超过4K的字符串,你必须绑定参数。

    为了在.net中绑定参数,我们将使用odp.net。

    第一步

    添加对您项目的引用。

    1. 在 .net 项目资源管理器窗口中右键单击引用,然后单击添加引用。
    2. 在 .net 选项卡上,找到 Oracle.DataAccess 并将其添加到项目中。

    第二步

    将此添加到页面顶部:

    using Oracle.DataAccess.Client;
    

    第三步

    现在我们编码:

    using (OracleConnection con = new OracleConnection("Here comes your oracle connection string."))
    {
        con.Open();
    
        //prepare the command
        OracleCommand cmd = con.CreateCommand();
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = @"INSERT INTO MyTable VALUES (:param0) ";
    
        //define the parameter.
        OracleParameter param0 = new OracleParameter();
        param0.OracleDbType = OracleDbType.Clob;
        param0.Value = "very long xml...";
        param0.ParameterName = "param0";
        cmd.Parameters.Add(param0);
    
        try
        {
            AffectedRows = cmd.ExecuteNonQuery(); //execute the query
        }
        catch (Exception e)
        {
            return 0;
        }
    }
    

    现在它应该像魅力一样工作了:)

    备注

    1- 不要使用 System.Data.OracleClient,它已被弃用。

    2- 如果您的表列数据类型是 xmltype 并且仍然出现错误,请将您的数据类型更改为 clob。

    希望这对其他人有所帮助...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 2012-07-19
      • 2012-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多