C#使用ODAC向Oracle数据库插入海量实时数据

上海浦东机场新建跑道埋设应力应变传感器,监测跑道日常数据,使用Micron某型号数据采集仪器和其对应的Enlight SDK做二次开发。期间采集的数据需精确到毫秒,使用C#自带的OracleClient无法满足要求,遂使用ODAC开发。

ODAC下载安装:

  1. 网上上搜索下载XCopy版本

  2. 安装部署

    1. install.bat odp.net4 c:\oracle myhome true
    2. 设置环境变量:
      ORACLE_HOME=c:\oracle
      (添加一个环境变量ORACLE_HOME,其值为你的安装路径,比如我这里就是c:\oracle)
      PATH=%ORACLE_HOME%;%ORACLE_HOME%\bin;
      (在PATH环境变量中添加下面两个路径,用分号隔开:%ORACLE_HOME%;%ORACLE_HOME%\bin;)

    3. 把tnsnames.ora 拷贝到 C:\oracle\network\admin\

如果对Oracle不是太熟悉,注意运行调试时做如下操作:

  • Server电脑Oracle启动服务: 一个Listener, 一个OracleServiceORCL
  • Client端运行Net Manager, 修改服务命名->sfpc的主机名为Server的IP地址(sfpc对应你建立的服务名)
  • 运行PL/SQL 确认登录成功

C# 代码:

/// <summary>
        /// 批量插入数据
        /// </summary>
        /// <param name="columnRowData">键-值存储的批量数据:键是列名称,值是对应的数据集合</param>
        /// <param name="len">每次批处理数据的大小</param>
        /// <returns></returns>        
        public static int BatchInsert(Dictionary<string, object> columnRowData, int len)
        {
            /*
            if (string.IsNullOrEmpty(tableName))
            {
                throw new ArgumentException("必须指定批量插入的表名称", "tableName");
            }
            */
            if (columnRowData == null || columnRowData.Count < 1)
            {
                throw new ArgumentException("必须指定批量插入的字段名称", "columnRowData");
            }

            if (len <= 0)
                return 0;

            int iResult = 0;
            string[] dbColumns = columnRowData.Keys.ToArray();
            StringBuilder sbCmdText = new StringBuilder();
            if (columnRowData.Count > 0)
            {
                //准备插入的SQL
                sbCmdText.AppendFormat("INSERT INTO {0}(", TABLENAME);
                sbCmdText.Append(string.Join(",", dbColumns));
                sbCmdText.Append(") VALUES (");
                sbCmdText.Append(":" + string.Join(",:", dbColumns));
                sbCmdText.Append(")");

                //using (OracleConnection conn = new OracleConnection(conStr))
                //{
                //    using (OracleCommand cmd = conn.CreateCommand())
                //    {
                //绑定批处理的行数
                command.Connection = myConnection;
                command.ArrayBindCount = len;
                command.BindByName = true;
                command.CommandType = CommandType.Text;
                command.CommandText = sbCmdText.ToString();
                command.CommandTimeout = 1;//1秒

                //创建参数
                OracleParameter oraParam;
                List<IDbDataParameter> cacher = new List<IDbDataParameter>();
                OracleDbType dbType = OracleDbType.Object;
                foreach (string colName in dbColumns)
                {
                    dbType = GetOracleDbType(columnRowData[colName]);
                    oraParam = new OracleParameter(colName, dbType);
                    oraParam.Direction = ParameterDirection.Input;
                    oraParam.OracleDbTypeEx = dbType;

                    oraParam.Value = columnRowData[colName];
                    command.Parameters.Add(oraParam);
                }
                //打开连接
                //conn.Open();

                /*执行批处理*/
                var trans = myConnection.BeginTransaction();
                try
                {
                    command.Transaction = trans;
                    iResult = command.ExecuteNonQuery();
                    trans.Commit();
                }
                catch (Exception ex)
                {
                    trans.Rollback();
                    ErrorLog.WriteExceptionLog(ex);
                    throw ex;
                }

                //    }
                //}
            }
            return iResult;
        }

        /**
         * 根据数据类型获取OracleDbType
         */
        private static OracleDbType GetOracleDbType(object value)
        {
            OracleDbType dataType = OracleDbType.Object;
            if (value is string[])
            {
                dataType = OracleDbType.Varchar2;
            }
            else if (value is DateTime[])
            {
                dataType = OracleDbType.TimeStamp;
            }
            else if (value is int[] || value is short[])
            {
                dataType = OracleDbType.Int32;
            }
            else if (value is long[])
            {
                dataType = OracleDbType.Int64;
            }
            else if (value is decimal[] || value is double[] || value is float[])
            {
                dataType = OracleDbType.Decimal;
            }
            else if (value is Guid[])
            {
                dataType = OracleDbType.Varchar2;
            }
            else if (value is bool[] || value is Boolean[])
            {
                dataType = OracleDbType.Byte;
            }
            else if (value is byte[])
            {
                dataType = OracleDbType.Blob;
            }
            else if (value is char[])
            {
                dataType = OracleDbType.Char;
            }
            return dataType;
        }

需要用到的DLL,下载

  • oci.dll
  • ociw32.dll
  • Oracle.DataAccess.dll
  • orannzsbb11.dll
  • oraocci11.dll
  • oraociicus11.dll
  • OraOps11w.dll
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值