【问题标题】:Bulk data insert from SQL to Oracle using C#.NET使用 C#.NET 将批量数据从 SQL 插入到 Oracle
【发布时间】:2017-05-22 09:30:01
【问题描述】:

以下代码 sn-p 用于将数据从 SQL DB 批量插入 Oracle 数据库。

我在 oracle 数据库中使用了带有 2 个参数(int 和 string)的存储过程

执行查询时出现以下错误。请帮我解决这个问题。或为批量数据插入提出任何好的解决方案。

我的查询:

List<int> arrPersonId = new List<int>();

        foreach (DataRow row in ds.Tables[0].Rows)
        {
            arrPersonId.Add(Convert.ToInt32(row["USER_ID"]));

        }

        List<string> arrPersonName = new List<string>();

        foreach (DataRow row in ds.Tables[0].Rows)
        {
            arrPersonName.Add(row["USERNAME"].ToString());
        }

        OracleConnection connection = new OracleConnection();
        connection.ConnectionString = DAKObj.GetOraConnectionString();

        OracleCommand command = new OracleCommand();
        command.Connection = connection;

        command.CommandType = CommandType.StoredProcedure;
        command.CommandText = "sp_InsertByODPNET";

        command.Parameters.Add("@PersonId", OracleDbType.Int32);
        command.Parameters[0].Value = arrPersonId;
        command.Parameters.Add("@PersonName", OracleDbType.Varchar2, 100);
        command.Parameters[1].Value = arrPersonName;
       command.ArrayBindCount = arrPersonId.Count;

       connection.Open();
       command.ExecuteNonQuery();
       connection.Close();

错误:-

“System.InvalidCastException”类型的异常发生在 Oracle.DataAccess.dll 但未在用户代码中处理

附加信息:无法转换类型的对象 'System.Collections.Generic.List`1[System.Int32]' 输入 'System.Array'

【问题讨论】:

  • 您是否尝试过使用表值参数进行批量插入?可以为您带来巨大的性能优势。
  • @RahulKishore :请您解释一下……谢谢

标签: c# sql asp.net sql-server oracle


【解决方案1】:

问题似乎是.Net 提供者不喜欢List&lt;int&gt;,并且不够聪明(或没有足够的信息)调用ToArray 来获取数组。您可以尝试以下方法:

List<int> lstPersonId = new List<int>();

foreach (DataRow row in ds.Tables[0].Rows)
  {
  lstPersonId.Add(Convert.ToInt32(row["USER_ID"]));
  }

List<string> lstPersonName = new List<string>();

foreach (DataRow row in ds.Tables[0].Rows)
  {
  lstPersonName.Add(row["USERNAME"].ToString());
  }

int[] arrPersonId = lstPersonId.ToArray();
string[] arrPersonName = lstPersonName.ToArray();

OracleConnection connection = new OracleConnection();
connection.ConnectionString = DAKObj.GetOraConnectionString();

OracleCommand command = new OracleCommand();
command.Connection = connection;

command.CommandType = CommandType.StoredProcedure;
command.CommandText = "sp_InsertByODPNET";

command.Parameters.Add("@PersonId", OracleDbType.Int32);
command.Parameters[0].Value = arrPersonId;
command.Parameters.Add("@PersonName", OracleDbType.Varchar2, 100);
command.Parameters[1].Value = arrPersonName;
command.ArrayBindCount = arrPersonId.Length;

connection.Open();
command.ExecuteNonQuery();
connection.Close();

未在动物身上进行测试 - 你会是第一个! :-)

【讨论】:

    猜你喜欢
    • 2010-09-25
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 2021-01-19
    • 1970-01-01
    相关资源
    最近更新 更多