C#使用ODAC向Oracle数据库插入海量实时数据
2015-11-22 13:39
671 查看
上海浦东机场新建跑道埋设应力应变传感器,监测跑道日常数据,使用Micron某型号数据采集仪器和其对应的Enlight SDK做二次开发。期间采集的数据需精确到毫秒,使用C#自带的OracleClient无法满足要求,遂使用ODAC开发。
ODAC下载安装:
网上上搜索下载XCopy版本
安装部署
install.bat odp.net4 c:\oracle myhome true
设置环境变量:
ORACLE_HOME=c:\oracle
(添加一个环境变量ORACLE_HOME,其值为你的安装路径,比如我这里就是c:\oracle)
PATH=%ORACLE_HOME%;%ORACLE_HOME%\bin;
(在PATH环境变量中添加下面两个路径,用分号隔开:%ORACLE_HOME%;%ORACLE_HOME%\bin;)
把tnsnames.ora 拷贝到 C:\oracle\network\admin\
如果对Oracle不是太熟悉,注意运行调试时做如下操作:
Server电脑Oracle启动服务: 一个Listener, 一个OracleServiceORCL
Client端运行Net Manager, 修改服务命名->sfpc的主机名为Server的IP地址(sfpc对应你建立的服务名)
运行PL/SQL 确认登录成功
C# 代码:
需要用到的DLL,下载
oci.dll
ociw32.dll
Oracle.DataAccess.dll
orannzsbb11.dll
oraocci11.dll
oraociicus11.dll
OraOps11w.dll
ODAC下载安装:
网上上搜索下载XCopy版本
安装部署
install.bat odp.net4 c:\oracle myhome true
设置环境变量:
ORACLE_HOME=c:\oracle
(添加一个环境变量ORACLE_HOME,其值为你的安装路径,比如我这里就是c:\oracle)
PATH=%ORACLE_HOME%;%ORACLE_HOME%\bin;
(在PATH环境变量中添加下面两个路径,用分号隔开:%ORACLE_HOME%;%ORACLE_HOME%\bin;)
把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
相关文章推荐
- Oracle协议适配器错误解决办法
- 深入理解Oracle 的并行执行
- Oracle并行详解
- 95.Oracle数据库SQL开发之 修改表内存——查询闪回
- 94.Oracle数据库SQL开发之 修改表内存——数据库事务的SERIALIZABLE事务
- 93.Oracle数据库SQL开发之 修改表内存——数据库事务的事务隔离级别
- 92.Oracle数据库SQL开发之 修改表内存——数据库事务的事务锁
- 91.Oracle数据库SQL开发之 修改表内存——数据库事务的并发事务
- 90.Oracle数据库SQL开发之 修改表内存——数据库事务的ACID特性
- Oracle 特殊字符模糊查询的方法
- 89.Oracle数据库SQL开发之 修改表内存——数据库事务的保存点
- 88.Oracle数据库SQL开发之 修改表内存——数据库事务的开始和结束
- 87.Oracle数据库SQL开发之 修改表内存——数据库事务的提交和回滚
- 86.Oracle数据库SQL开发之 修改表内存——使用MERGE合并行
- 85.Oracle数据库SQL开发之 修改表内存——使用默认值
- 84.Oracle数据库SQL开发之 修改表内存——数据库的完整性
- 83.Oracle数据库SQL开发之 修改表内存——DELETE语句删除行
- 82.Oracle数据库SQL开发之 修改表内存——RETURNING子句
- 81.Oracle数据库SQL开发之 修改表内存——使用UPDATE语句
- 80.Oracle数据库SQL开发之 修改表内存——使用INSERT语句