Как вставить более 4000 символов в XmlType с помощью OracleClientFactory? - PullRequest
3 голосов
/ 26 мая 2011

Я пытаюсь вставить кусок Xml, размер которого превышает 4000 символов, в поле XmlType в таблице Oracle.

Первоначально мой код работал так:

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

Однако, как только я начал пытаться вставлять блоки XML размером более 4000 байт, я получил:

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

Thisтакая же проблема, как и этот вопрос 2508987 / insert-xml-with-больше-4000-символов-в-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 в моей колонке.

Ответы [ 2 ]

2 голосов
/ 27 мая 2011

Вы должны Oracle Docs для библиотеки ODP.NET, особенно для настройки информации 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();
0 голосов
/ 21 марта 2013

свяжите это так: .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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...