如何在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




