【问题标题】:Unable to cast object of type 'System.String' to type 'System.Array' Oracle bulk insert无法将“System.String”类型的对象转换为“System.Array”Oracle 批量插入类型
【发布时间】:2018-09-17 13:46:14
【问题描述】:

我正在尝试在 Oracle 表中插入批量数据,但不幸遇到此错误:

无法将“System.String”类型的对象转换为“System.Array”类型。

我已经尝试了这些链接的答案,但它不起作用。

why does this oracle bulk insert not work

put your arrays in a bind

bulk data insertion oracle

这是我的代码:

private void InsertInTempMachineResults(ResultObject resultObject)
    {
        string command = @"INSERT INTO ANALYZERS.TEMP_MACHINE_RESULTS (SAMPLE_ID, TEST_ID, TEST_VALUES, " +
            "TEST_VALUES_SYMBOL, TEST_VALUE_UNIT, RESULT_DATE, STRING_ID, MACHINE_ID, PARSING_SOURCE) VALUES(" +
            ":sampleId, :testId, :testValue, :testValueSymbol, :testUnit, SYSDATE, :stringId, :machineId, " +
            ":parsingSource)";

        OracleCommand oracleCommand = new OracleCommand(command, Utils.Connection)
        {
            CommandType = System.Data.CommandType.Text
        };

        oracleCommand.ArrayBindCount = resultObject.ResultItems.Count;
        oracleCommand.BindByName = true;
        OracleParameter[] parameters = {
            new OracleParameter("sampleId", resultObject.SampleId),
            new OracleParameter("testId", OracleDbType.Varchar2, 
                                resultObject.ResultItems.Select(r => r.TestId).ToArray(), ParameterDirection.Input),
            new OracleParameter("testValue", OracleDbType.Varchar2, 
                                resultObject.ResultItems.Select(r => r.TestValue).ToArray(), ParameterDirection.Input),
            new OracleParameter("testValueSymbol", OracleDbType.Varchar2, 
                                resultObject.ResultItems.Select(r => r.Symbol).ToArray(), ParameterDirection.Input),
            new OracleParameter("testUnit", OracleDbType.Varchar2, 
                                resultObject.ResultItems.Select(r => r.Unit).ToArray(), ParameterDirection.Input),
            new OracleParameter("stringId", OracleDbType.Varchar2, resultObject.StringId, ParameterDirection.Input),
            new OracleParameter("machineId", OracleDbType.Varchar2, resultObject.MachineId, ParameterDirection.Input),
            new OracleParameter("parsingSource", OracleDbType.Varchar2, "C#", ParameterDirection.Input),
        };
        oracleCommand.Parameters.AddRange(parameters);
        if (Utils.Connection.State != ConnectionState.Open)
        {
            Utils.Connection.Open();
        }
        try
        {
            int result = oracleCommand.ExecuteNonQuery();
            if (result <= 0)
            {
                Console.WriteLine("ERROR_INSERT_TEMP_MACHINE_RESULTS: {0}", "Unable to add data.");
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("EXCEPTION_INSERT_TEMP_MACHINE_RESULTS: {0}", e.Message);
            throw e;
        }
    }

谢谢

【问题讨论】:

  • OracleDbType.Varchar2 表示字符串,而您正在传递数组...
  • 它到底在哪里抛出异常?
  • @PatrickHofman Unable to cast object of type 'System.String' to type 'System.Array'
  • 我问在哪里,我没有要求从问题中复制错误...
  • 你确定不是所有的参数都必须是数组吗?

标签: c# oracle bulkinsert odp.net


【解决方案1】:

正如 Patrick Hofman 在评论中建议的那样,如果要批量插入,则必须将所有参数转换为数组。 问题解决了。

【讨论】:

  • 是的,你是对的。我已将所有参数转换为其工作的数组。非常感谢。
猜你喜欢
  • 2012-09-07
  • 2014-03-14
  • 2017-11-24
  • 1970-01-01
  • 2021-04-26
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多