首页 > 数据库 >.net批量插入到oracle数据库

.net批量插入到oracle数据库

时间:2023-12-12 15:22:37浏览次数:43  
标签:数据库 cmd sqlbulkcopy Add connection oracle new net dt

最近用到批量插入数据到oracle,总结了网上的方案

 

方式一:使用数组绑定

https://www.codenong.com/343299/

数据库:CREATE TABLE jkl_test (id NUMBER(9));

USING Oracle.DataAccess.Client;

namespace OracleArrayInsertExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // OPEN a connection USING ODP.Net
            var connection = new OracleConnection("Data Source=YourDatabase; Password=YourPassword; User Id=YourUser");
            connection.Open();

            // CREATE an INSERT command
            var command = connection.CreateCommand();
            command.CommandText ="insert into jkl_test values (:ids)";

            // SET up the parameter AND provide VALUES
            var param = new OracleParameter("ids", OracleDbType.Int32);
            param.Value = new int[] { 22, 55, 7, 33, 11 };

            // This IS critical TO the process; IN ORDER FOR the command TO
            // recognize AND bind arrays, an array bind COUNT must be specified.
            // SET it TO the LENGTH OF the array.
            command.ArrayBindCount = 5;
            command.Parameters.Add(param);
            command.ExecuteNonQuery();
        }
    }
}

 

方式二 使用绑定变量的方式二

https://blog.csdn.net/weixin_50478033/article/details/133983591

public int InsertBindParam(DataTable dt)
{
    int recordCount = dt.Rows.Count, i = 0, count = 0;
 
    using (OracleCommand cmd = new OracleCommand())
    {
        cmd.CommandText = "INSERT INTO TEST001(COL1,COL2,COL3) VALUES(:P_COL1,:P_COL2,:P_COL3)";
        //指定单次需要处理的条数
        cmd.ArrayBindCount = recordCount;
        int[] p_col1 = new int[recordCount];
        string[] p_col2 = new string[recordCount];
        DateTime[] p_col3 = new DateTime[recordCount];
 
        cmd.Parameters.Add(new OracleParameter("P_COL1", OracleDbType.Int32, p_col1, ParameterDirection.Input));
        cmd.Parameters.Add(new OracleParameter("P_COL2", OracleDbType.Varchar2, p_col2, ParameterDirection.Input));
        cmd.Parameters.Add(new OracleParameter("P_COL3", OracleDbType.Date, p_col3, ParameterDirection.Input));
 
        foreach (DataRow dr in dt.Rows)
        {
            p_col1[i] = Convert.ToInt32(dr["COL1"].ToString());
            p_col2[i] = dr["COL2"].ToString();
            p_col3[i] = DateTime.Now;
        }
 
        using (var con = new OracleConnection())
        {
            con.ConnectionString = m_sConnection;
            con.Open();
 
            cmd.Connection = con;
            //执行批处理操作,并返回影响行数
            count = cmd.ExecuteNonQuery();  
        }
 
        return count;
    }
}

 

方式三 使用OracleBulkCopy

https://www.cnblogs.com/longbky/p/8146965.html

public static bool ExcuteNonQuery(DataTable dt)
        {
            using (SqlConnection connection = new SqlConnection(connStr))//创建数据库连接
            {
                using (SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(connection))
                {
                    connection.Open();
                    //sqlbulkcopy.BulkCopyTimeout = 100;  //超时之前操作完成所允许的秒数
                    sqlbulkcopy.BatchSize = dt.Rows.Count;  //每一批次中的行数
                    sqlbulkcopy.DestinationTableName = dt.TableName;  //服务器上目标表的名称
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);  //映射定义数据源中的列和目标表中的列之间的关系
                    }
                    sqlbulkcopy.WriteToServer(dt);  // 将DataTable数据上传到数据表中
                }
            }
            return true;
        }

拷贝博主的内容

特别注意  sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);

插入的时候列的顺序可以不一致,但名称和数据类型最好要保存一致。不一致时候,也能进行正确的转换,除了比如DataTime数据类型,不能插入一个无效的string时间字符串。

在插入数据的时候如果数据类型是Guid类型的时候。一定要创建列的时候一定要指定数据类型: dt.Columns.Add("UserID", typeof(System.Data.SqlTypes.SqlGuid));,

不然会报“来自数据源的 String 类型的给定值不能转换为指定目标列的类型 uniqueidentifier。”这个错。

 

标签:数据库,cmd,sqlbulkcopy,Add,connection,oracle,new,net,dt
From: https://www.cnblogs.com/ggll611928/p/17897005.html

相关文章

  • AttributeError: 'NoneType' object has no attribute 'replace'
    在python中执行Js代码,引入execjs库,python代码如下:执行结果如下:在导入execjs模块前,让Popen的encoding参数锁定为utf-8。importsubprocessfromfunctoolsimportpartialsubprocess.Popen=partial(subprocess.Popen,encoding="utf-8") ......
  • Oracle 表空间常用SQL
    --1、查看表空间的名称、大小、剩余空间SELECTt.tablespace_nameas表空间名,round(SUM(bytes/(1024*1024)),0)as大小_MFROMdba_tablespacestinnerjoindba_data_filesd on t.tablespace_name=d.tablespace_nameGROUPBYt.tablespace_name;--2、查看表空间物理......
  • Django 创建项目时找不到数据库sqlite3,提示no changes detected
    原因:PyCharm创建Django项目,找不到数据库sqlite3 解决:如果没有默认的db文件,则应在PyCharm终端中执行以下命令:pythonmanage.pymakemigrations:提示pythonmanage.pymigrate ......
  • .net formwork WebApi 跨域问题
    ASP.NETFormwork Api/ASP.NetCoreApi 做比较。有关 Global.asax、FilterConfig.cs和RouteConfig.cs等都被Program.cs和Startup.cs两个类取而代之.程序中把Program.cs作为Web应用程序的入口,程序启动的时候会调用Startup.cs类。Startup.cs作用就是,对项目......
  • 数据库学习
    前言IDEA集成了众多插件,方便开发者使用,使用其自带的Database模块就可以很方便的配置、连接到数据库。查看MySQL运行状态先启动MySQL,快捷键win+r然后输入services.msc,查找MySQL然后启动MySQLServer。IDEA开启数据库连接模块点击View->ToolWindows->Database开启数据库模块......
  • 工业生产中Profibus主站转Profinet网关优势所在
    应用案例分享:某制造企业拥有一条生产线,生产线上的多个设备之间需要进行数据通讯和相互控制。这些设备原本使用Profibus-DP总线进行通讯,但企业希望将这些设备集成到Profinet网络中,以便能够更好地实现设备监控和管理。我们为此提供了一款Profibus-DP主站转Profinet网关,将多个Profibu......
  • 达梦数据库重新初始化
    1.删除原数据库实例服务进入数据库安装目录./script/root/dm_service_uninstaller.sh-nDmServicedmdbDmServicedmdb是数据库实例的默认名称忘记名称可以在系统服务下查询Dm相关service2.删除数据库目录rm-rf/data/dm-data/DAMENG/*3.创建数据库实例切换到达梦用......
  • windowserver2012服务器部署.net core3.1环境
    一、安装.netcore3.1要先具备这些系统补丁,如果没有则需要安装,这些KB必须按以下顺序安装:(clearcompressionflag.exe、KB2919442、KB2919355、KB2932046、KB2959977、KB2937592、KB2938439、KB2934018)安装过程中需要多次重启生效。最后安装vc_redist.x64.exe)二、.netcore3.......
  • .net core sftp
    usingRenci.SshNet;///<summary>///上传文件到ftp服务器上///</summary>///<paramname="file">文件</param>///<paramname="dateStr">文件时间戳</param>///<returns&g......
  • Oracle-修改数据库密码
    当Oracle数据库用户的密码过期时,你可以采取以下步骤来处理:1、连接到数据库:使用具有管理员权限的账户(比如SYS或SYSTEM用户)连接到Oracle数据库。查看过期用户:运行以下SQL查询语句查看已过期的用户列表:SELECTusernameFROMdba_usersWHEREaccount_status='EXPIRED......