使用C#.NET从SQL向Oracle大容量插入数据

使用C#.NET从SQL向Oracle大容量插入数据,c#,sql,asp.net,sql-server,oracle,C#,Sql,Asp.net,Sql Server,Oracle,以下代码段用于将数据从SQL DB大容量插入Oracle数据库 我在oracle数据库中使用了带有2个参数(int和string)的存储过程 我在执行查询时遇到以下错误。请帮我解决这个问题。或者为批量数据插入提供任何好的解决方案 我的问题是: List<int> arrPersonId = new List<int>(); foreach (DataRow row in ds.Tables[0].Rows) { a

以下代码段用于将数据从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();
List arrPersonId=new List();
foreach(ds.Tables[0].行中的DataRow行)
{
arrPersonId.Add(将.Convert.ToInt32(第[“用户ID”行]);
}
List arrPersonName=新列表();
foreach(ds.Tables[0].行中的DataRow行)
{
arrPersonName.Add(第[“USERNAME”].ToString()行);
}
OracleConnection=新的OracleConnection();
connection.ConnectionString=DAKObj.GetOraConnectionString();
OracleCommand=新的OracleCommand();
command.Connection=连接;
command.CommandType=CommandType.storedProcess;
command.CommandText=“sp_InsertByODPNET”;
Add(“@PersonId”,OracleDbType.Int32);
command.Parameters[0]。Value=arrPersonId;
Add(“@PersonName”,OracleDbType.varchar2100);
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”


问题似乎是.Net提供程序不喜欢
列表
,并且不够聪明(或者没有足够的信息)调用
到阵列
,以获取阵列。您可以尝试以下方法:

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();
List lstPersonId=new List();
foreach(ds.Tables[0].行中的DataRow行)
{
lstPersonId.Add(将.Convert.ToInt32(第[“用户ID”行]);
}
List lstPersonName=新列表();
foreach(ds.Tables[0].行中的DataRow行)
{
lstPersonName.Add(行[“用户名”].ToString());
}
int[]arrPersonId=lstPersonId.ToArray();
字符串[]arrPersonName=lstPersonName.ToArray();
OracleConnection=新的OracleConnection();
connection.ConnectionString=DAKObj.GetOraConnectionString();
OracleCommand=新的OracleCommand();
command.Connection=连接;
command.CommandType=CommandType.storedProcess;
command.CommandText=“sp_InsertByODPNET”;
Add(“@PersonId”,OracleDbType.Int32);
command.Parameters[0]。Value=arrPersonId;
Add(“@PersonName”,OracleDbType.varchar2100);
command.Parameters[1]。Value=arrPersonName;
command.ArrayBindCount=arrPersonId.Length;
connection.Open();
command.ExecuteNonQuery();
connection.Close();

没有在动物身上测试-你会是第一个!:-)

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