You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在C#中通过ExecuteNonQuery批量插入Oracle表及执行多条Insert语句

嘿,我来帮你搞定在C#里给Oracle数据库批量插入记录的问题!不管是用ExecuteNonQuery方法,还是执行多条独立的INSERT语句,都有几种实用的方案,咱们一步步说:

方法一:参数化批量绑定(推荐,高效+防注入)

这是Oracle官方推荐的批量操作方式,完美适配ExecuteNonQuery,而且能避免SQL注入,效率也比单条执行高很多。核心思路是给命令参数设置数组值,一次性提交所有记录。

示例代码如下:

using Oracle.ManagedDataAccess.Client; // 用Oracle官方托管驱动更方便
using System;

class Program
{
    static void Main()
    {
        string connectionString = "你的Oracle连接字符串(比如User Id=xxx;Password=xxx;Data Source=xxx)";
        
        // 准备要插入的多组数据
        int[] ids = { 1, 2, 3, 4 };
        string[] values = { "A", "Ab", "Ac", "At" };

        using (OracleConnection conn = new OracleConnection(connectionString))
        {
            conn.Open();
            // 编写参数化的INSERT语句,用占位符代替具体值
            string sql = "INSERT INTO 你的表名(id, content_column) VALUES (:Id, :Content)";
            
            using (OracleCommand cmd = new OracleCommand(sql, conn))
            {
                // 给参数绑定数组值
                cmd.Parameters.Add(":Id", OracleDbType.Int32);
                cmd.Parameters[":Id"].Value = ids;
                
                cmd.Parameters.Add(":Content", OracleDbType.Varchar2);
                cmd.Parameters[":Content"].Value = values;
                
                // 关键:告诉命令要批量处理的行数
                cmd.ArrayBindCount = ids.Length;
                
                // 执行批量插入,返回受影响的总条数
                int affectedRows = cmd.ExecuteNonQuery();
                Console.WriteLine($"成功插入{affectedRows}条记录");
            }
        }
    }
}
方法二:执行多条独立INSERT语句(适合少量数据)

如果你的场景是要执行多条像Insert into table values (1,'A')这样的独立语句,也可以把它们用分号拼接起来,然后一次性执行。不过重点提醒:这种方式如果是动态生成语句,一定要警惕SQL注入,绝对不要直接拼接用户输入的内容!

示例代码:

using Oracle.ManagedDataAccess.Client;
using System;

class Program
{
    static void Main()
    {
        string connectionString = "你的Oracle连接字符串";
        // 把多条INSERT语句用分号分隔,拼成一个批量SQL
        string sqlBatch = @"
            INSERT INTO 你的表名 VALUES (1,'A');
            INSERT INTO 你的表名 VALUES (2,'Ab');
            INSERT INTO 你的表名 VALUES (3,'Ac');
            INSERT INTO 你的表名 VALUES (4,'At');
        ";

        using (OracleConnection conn = new OracleConnection(connectionString))
        {
            conn.Open();
            using (OracleCommand cmd = new OracleCommand(sqlBatch, conn))
            {
                // 执行批量语句,返回受影响的总条数
                int affectedRows = cmd.ExecuteNonQuery();
                Console.WriteLine($"成功完成{affectedRows}条记录的插入");
            }
        }
    }
}

要是你需要动态生成这些语句,强烈建议改用方法一的参数化绑定,比直接拼接字符串安全太多,还能避免语法错误。

方法三:使用OracleBulkCopy(超大量数据首选)

如果要插入的记录特别多(比如上万条甚至几十万条),用OracleBulkCopy是效率最高的选择,它能直接把DataTable或其他数据源批量写入Oracle表,性能碾压前两种方法。

示例代码:

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

class Program
{
    static void Main()
    {
        string connectionString = "你的Oracle连接字符串";
        
        // 先构造一个包含要插入数据的DataTable
        DataTable dt = new DataTable();
        dt.Columns.Add("Id", typeof(int));
        dt.Columns.Add("Content", typeof(string));
        
        // 批量添加记录
        dt.Rows.Add(1, "A");
        dt.Rows.Add(2, "Ab");
        dt.Rows.Add(3, "Ac");
        dt.Rows.Add(4, "At");
        // 可以继续加更多行...

        using (OracleConnection conn = new OracleConnection(connectionString))
        {
            conn.Open();
            using (OracleBulkCopy bulkCopy = new OracleBulkCopy(conn))
            {
                // 指定要写入的目标表名
                bulkCopy.DestinationTableName = "你的表名";
                // 如果DataTable列名和Oracle表列名一致,这步映射可以省略
                bulkCopy.ColumnMappings.Add("Id", "id");
                bulkCopy.ColumnMappings.Add("Content", "content_column");
                
                // 执行批量复制
                bulkCopy.WriteToServer(dt);
                Console.WriteLine("超大量数据批量插入完成!");
            }
        }
    }
}

总结一下:少量数据可以用方法二凑活;中等数据量优先选方法一(参数化批量绑定,安全又高效);超大量数据直接上方法三(OracleBulkCopy,性能拉满)。

内容的提问来源于stack exchange,提问作者Ahmed Tahsen

火山引擎 最新活动