如何使用OracleClientFactory将超过4000个字符插入XmlType?

问题描述

| 我试图将大于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-to-a-oracle-xmltype-column相同的问题,但是我没有DbType.Clob作为选项(它没有\' t存在)。 接下来,我尝试将类型更改为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,sx);
现在我得到:
Value is not valid for DbType: Xml
确实,我只想在我的专栏中存储更大的XML块。     

解决方法

您应该使用ODP.NET库的Oracle文档,专门用于设置XMLType信息。
OracleXmlType
类及其用法也将分别描述。我本人并不是C#开发人员,所以我不能给您确切的代码。这是我发现在搜索的内容,但我自己还没有尝试过:
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();
    ,像这样绑定它:.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();
    }
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...