如何从 ASP.NET Core 更新/添加大量数据到 Oracle 数据库

问题描述 投票:0回答:1

我正在开发一个用 C# 编写的 ASP.NET Core MVC 应用程序,其中的

.cshtml
视图中有 2 个 jQuery 数据表。我想将这 2 个 jQuery 数据表中的大量数据添加并更新到 Oracle 数据库。

Oracle数据库中有2个存储过程。我想调用这 2 个存储过程来将记录添加和更新到 Oracle 数据库中。我想将数据插入到 Oracle DB 中的一个表中,并将数据更新到 Oracle DB 中的另一个表中(一次 2 个不同的操作)。

Oracle中是否有使用C#代码进行批量复制或批量插入或批量更新的操作?在一些帖子中,它说批量复制/插入不是执行此操作的正确方法。这是正确的吗?

OracleConnection con = new  OracleConnection(ConnectionString);
con.Open();

OracleCommand cmd = new OracleCommand(con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "procedure name";

cmd.ExecuteNonQuery();
 

如果向 Oracle 发送超过 1000 条记录,我会收到超时异常。有什么办法可以做到吗?

c# oracle asp.net-core-mvc ado.net
1个回答
0
投票

假设您有一个用户列表

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

您可以将批量插入与人员对象列表(列表)一起使用,并通过事务将这些人员批量插入或更新到您的 Oracle 数据库中

using Oracle.ManagedDataAccess.Client;
using System;
using System.Collections.Generic;
using System.Data;

public class OracleBulkOperations
{
    private readonly string connectionString = "your_connection_string";

    public void BulkInsertAndUpdate(List<Person> people)
    {
        using (var connection = new OracleConnection(connectionString))
        {
            connection.Open();
            using (var transaction = connection.BeginTransaction())
            {
                try
                {

                    // Bulk Insert using stored procedure
                    using (var cmdInsert = new OracleCommand("YourInsertStoredProcedure", connection))
                    {
                        cmdInsert.BindByName = true;
                        cmdInsert.CommandType = CommandType.StoredProcedure;

                        // Set the number of records being processed
                        cmdInsert.ArrayBindCount = people.Count;
    
                        // Bind arrays for insert
                        cmdInsert.Parameters.Add("p_ids", OracleDbType.Int32, people.Select(t=>t.ID).ToArray(), ParameterDirection.Input);
                        cmdInsert.Parameters.Add("p_names", OracleDbType.Varchar2, people.Select(t=>t.Name).ToArray(), ParameterDirection.Input);

                        // Execute bulk insert
                        cmdInsert.ExecuteNonQuery();
                    }

                  
                    // Commit the transaction
                    transaction.Commit();
                }
                catch (Exception ex)
                {
                    transaction.Rollback();
                    Console.WriteLine($"An error occurred: {ex.Message}");
                }
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.