Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用OracleClientFactory在XmlType中插入4000多个字符?_C#_Oracle - Fatal编程技术网

C# 如何使用OracleClientFactory在XmlType中插入4000多个字符?

C# 如何使用OracleClientFactory在XmlType中插入4000多个字符?,c#,oracle,C#,Oracle,我正在尝试将一块大于4000个字符的Xml插入到Oracle表中的XmlType字段中 最初,我的代码是这样工作的: DbParameter parameter = new DbParameter; parameter = clientFactory.CreateParameter(":p_xml_data", DbType.AnsiString, messageToLog.Length, ParameterDirection.Input, messageToLog); 但是,当我开始尝试插入

我正在尝试将一块大于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
这和这个问题是同一个问题,但是我没有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块

您应该为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();

按如下方式绑定:.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();
    }