使用ExecuteStoreCommand()插入Oracle XMLTYPE列

时间:2014-12-10 14:07:07

标签: .net oracle insert

我有一张像

这样的表格
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”。

我们如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

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

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

要添加超过4K的字符串,您必须绑定参数。

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

第一步

添加对项目的引用。

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

    将此添加到您的页面顶部:

    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。

    希望这有助于其他人......