【问题标题】:How do I insert more than 4000 characters into XmlType using OracleClientFactory?如何使用 OracleClientFactory 将超过 4000 个字符插入 XmlType?
【发布时间】:2011-05-26 16:41:12
【问题描述】:

我正在尝试将大于 4000 个字符的 Xml 块插入到 Oracle 表中的 XmlType 字段中。

原来我的代码是这样工作的:

DbParameter parameter = new DbParameter;
parameter = clientFactory.CreateParameter(":p_xml_data", DbType.AnsiString, messageToLog.Length, ParameterDirection.Input, messageToLog);

然而,当我开始尝试插入大于 4000 字节的 Xml 块时,我得到了:

ORA-01461: can bind a LONG value only for insert into a LONG column

这与2508987/insert-xml-with-more-than-4000-characters-into-a-oracle-xmltype-column 的问题相同,但是我没有 DbType.Clob 作为选项(它不存在)。

接下来我尝试将类型更改为 DbType.Object,希望它能将其转换为所需的任何内容,但我收到以下消息:

Cannot bind type System.String as Blob

然后我尝试使用 DbType.XML,我修改了我的代码以将 messageToLog 移动到 SqlXml 对象中:

SqlXml sx;
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(messageToLog);
using (XmlNodeReader xnr = new XmlNodeReader(xmlDoc))
{
    sx = new SqlXml(xnr);
}

并相应地更改了参数:

parameter = providerFactory.CreateParameter(":p_xml_data", DbType.Xml, messageToLog.Length, ParameterDirection.Input, sx);

现在我明白了:

Value is not valid for DbType: Xml

确实,我只是想在我的专栏中存储更大的 XML 块。

【问题讨论】:

    标签: c# oracle


    【解决方案1】:

    您应该将Oracle Docs 用于ODP.NET 库,专门用于设置XMLType 信息。 OracleXmlType 类及其用途也分别是 described。我自己并不是真正的 C# 开发人员,所以我不能给你确切的代码。 This is what I found到处找,我自己没试过:

    OracleCommand orainscmd = new OracleCommand("INSERT INTO employees(empinfo) " +
    " VALUES (:empinfoxml)", con);
    orainscmd.Parameters.Add(":empinfoxml", OracleDbType.XmlType);
    OracleXmlType xmlinfo = new OracleXmlType(con,doc);
    orainscmd.Parameters[0].Value=xmlinfo;
    orainscmd.ExecuteNonQuery();
    

    【讨论】:

      【解决方案2】:

      像这样绑定它:.OracleDbType = OracleDbType.XmlType;

      .DBType = DbType.Xml 不起作用,会抛出运行时错误,因为枚举值超出范围。

      见下文:

          public void insertSimRun(OracleConnection conn, SliceDataExchange.ServiceReference1.SimulationRun simRun)
          {
              string sqlInsert = "INSERT INTO slice_sim (runid, first_int_start, simulation_run) ";
              sqlInsert += "values (:p_runid, :p_interval_start, :p_simxml)";
      
              OracleCommand cmdInsertSR = new OracleCommand();
              cmdInsertSR.CommandText = sqlInsert;
              cmdInsertSR.Connection = conn;
      
              OracleParameter runID = new OracleParameter();
              runID.DbType = DbType.Int32;
              runID.Value = simRun.RunId;
              runID.ParameterName = "p_runid";
      
              OracleParameter first_interval_start = new OracleParameter();
              first_interval_start.DbType = DbType.DateTime;
              first_interval_start.Value = simRun.FirstIntervalStartUtc;
              first_interval_start.ParameterName = "p_interval_start";
      
              var serializer = new XmlSerializer(typeof(SliceDataExchange.ServiceReference1.SimulationRun));
              StringWriter writer = new StringWriter();
              //System.Xml.XmlDocument xdoc = new System.Xml.XmlDocument();
      
              serializer.Serialize(writer,simRun);
      
              //xdoc.LoadXml(writer.ToString());
      
              OracleParameter simRunXML = new OracleParameter();
              simRunXML.DbType = DbType.String;
              simRunXML.ParameterName = "p_simxml";
              simRunXML.Value = writer.ToString();
              simRunXML.OracleDbType = OracleDbType.XmlType;
      
      
              cmdInsertSR.Parameters.Add(runID);
              cmdInsertSR.Parameters.Add(first_interval_start);
              cmdInsertSR.Parameters.Add(simRunXML);
      
              cmdInsertSR.ExecuteNonQuery();
      
              cmdInsertSR.Dispose();
          }
      

      【讨论】:

        猜你喜欢
        • 2011-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-23
        • 2018-09-08
        • 1970-01-01
        • 2015-05-15
        相关资源
        最近更新 更多