批量Excel数据导入Oracle数据库

简介:

由于一直基于Oracle数据库上做开发,因此常常会需要把大量的Excel数据导入到Oracle数据库中,其实如果从事SqlServer数据库的开发,那么思路也是一样的,本文主要介绍如何导入Excel数据进入Oracle数据库的内容。

一般我们拿到的Excel数据,都会有一个表头说明,然后下面是一连串的数据内容,如下图所示:

 

而Oracle中数据库一般为英文名称,中文名称就需要转义,为了方便导入,我把中文名称对照数据库的字段,把表头修改为对应的字段名称,如果没有数据库对应的字段,那么删除Excel的无用列即可,如下所示。

 

首先我们在导入Excel的例子中加载显示要导入的数据,一个是为了直观,第二个也是为了检查数据的有效性,避免出错,界面如下所示:

 

在介绍导入操作前,我们先要分析下数据,否则就很容易出现错误的语句,一般日期的格式、数字的格式就要特别注意,文本格式一般看是否超出字段的长度,一般成功导入前都会发生好多次的错误问题,解决了这些格式的问题,基本上就OK了。如下面日期和数字的格式问题,就必须注意转换为对应的内容格式:

 

下面介绍具体的显示数据和导入数据的操作代码:

 显示Excel数据的代码如下所示:

         private   string  connectionStringFormat  =   " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = '{0}';Extended Properties=Excel 8.0 " ;
        
private  DataSet myDs  =   new  DataSet();

        
private   void  btnViewData_Click( object  sender, EventArgs e)
        {
            
if  ( this .txtFilePath.Text  ==   "" )
            {
                MessageUtil.ShowTips(
" 请选择指定的Excel文件 " );
                
return ;
            }

            
string  connectString  =   string .Format(connectionStringFormat,  this .txtFilePath.Text);
            
try
            {
                myDs.Tables.Clear();
                myDs.Clear();
                OleDbConnection cnnxls 
=   new  OleDbConnection(connectString);
                OleDbDataAdapter myDa 
=   new  OleDbDataAdapter( " select * from [Sheet1$] " , cnnxls);
                myDa.Fill(myDs, 
" c " );

                dataGrid1.DataSource 
=  myDs.Tables[ 0 ];
            }
            
catch  (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

导入操作的代码如下所示(由于数据格式需要验证,以及需要判断数据库是否存在指定关键字的记录,如果存在,那么更新,否则插入新的记录,如果仅仅是第一次导入,操作代码可以更为精简一些):

         private   void  btnSaveData_Click( object  sender, EventArgs e)
        {
            
if  ( this .txtFilePath.Text  ==   "" )
            {
                MessageUtil.ShowTips(
" 请选择指定的Excel文件 " );
                
return ;
            }

            
if  (MessageUtil.ShowYesNoAndWarning( " 该操作将把数据导入到系统的用户数据库中,您确定是否继续? " ==  DialogResult.Yes)
            {
                InsertData();
            }
        }

        
private   bool  CheckIsDate( string  columnName)
        {
            
string  str  =   " ,PREPARE_DATE,COPY_DATE,COPY_VALIDITY,BUSINESS_VALIDITY,OPENING_APPROVAL_DATE,OPENING_DATE,EDITTIME,LICENSE_DATE,LICENSE_VALIDITY,TEMP_OPENING_DATE,LICENSE_START_DATE,ADDTIME,EDITTIME, " ;
            
return  str.Contains( " , "   +  columnName.ToUpper()  +   " , " );
        }

        
private   bool  CheckIsNumeric( string  columnName)
        {
            
string  str  =   " ,FIXED_CAPITAL,REG_CAPITAL,MARGIN,PARK_AREA,PARK_SPACE_NUMBER, " ;
            
return  str.Contains( " , "   +  columnName.ToUpper()  +   " , " );
        }

        
private   void  InsertData()
        {
            
int  intOk  =   0 ;
            
int  intFail  =   0 ;

            
if  (myDs  !=   null   &&  myDs.Tables[ 0 ].Rows.Count  >   0 )
            {
                
string  accessConnectString  =  config.GetConnectionString( " DataAccess " );
                OracleConnection conn 
=   new  OracleConnection(accessConnectString);
                conn.Open();
                OracleCommand com 
=   null ;

                
#region  组装字段列表
                
string  insertColumnString  =   " ID, " ;
                DataTable dt 
=  myDs.Tables[ 0 ];
                
int  k  =   0 ;
                
foreach  (DataColumn col  in  dt.Columns)
                {
                    insertColumnString 
+=   string .Format( " {0}, " , col.ColumnName);
                }
                insertColumnString 
=  insertColumnString.Trim( ' , ' );

                
#endregion

                
try
                {
                    
foreach  (DataRow dr  in  dt.Rows)
                    {
                        
if  (dr[ 0 ].ToString()  ==   "" )
                        {
                            
continue ;
                        }

                        
#region  组装Sql语句
                        
string  insertValueString  =   " SEQ_TBPARK_ENTERPRISE.Nextval, " ;
                        
string  updateValueString  =   "" ;
                        
string  COMPANY_CODE  =  dr[ " COMPANY_CODE " ].ToString().Replace( " <空> " "" );

                        
#region  拼接Sql字符串

                        
for ( int  i  =   0 ; i  <  dt.Columns.Count; i ++ )
                        {
                            
string  originalValue  =  dr[i].ToString().Replace( " <空> " "" );
                            
// if (!CheckIsDate(dt.Rows[0][i].ToString()))
                             if  ( ! CheckIsDate(dt.Columns[i].ColumnName))
                            {
                                
if  ( ! string .IsNullOrEmpty(originalValue))
                                {
                                    
if  (CheckIsNumeric(dt.Columns[i].ColumnName))
                                    {
                                        insertValueString 
+=   string .Format( " '{0}', " , Convert.ToDecimal(originalValue));
                                        updateValueString 
+=   string .Format( " {0}='{1}', " , dt.Columns[i].ColumnName, Convert.ToDecimal(originalValue));
                                    }
                                    
else
                                    {
                                        insertValueString 
+=   string .Format( " '{0}', " , originalValue);
                                        updateValueString 
+=   string .Format( " {0}='{1}', " , dt.Columns[i].ColumnName, originalValue);
                                    }
                                }
                                
else
                                {
                                    insertValueString 
+=   string .Format( " NULL, " );
                                    updateValueString 
+=   string .Format( " {0}=NULL, " , dt.Columns[i].ColumnName);
                                }
                            }
                            
else
                            {
                                
if  ( ! string .IsNullOrEmpty(originalValue))
                                {
                                    insertValueString 
+=   string .Format( " to_date('{0}','yyyy-mm-dd'), " , Convert.ToDateTime(originalValue).ToString( " yyyy-MM-dd " ));
                                    updateValueString 
+=   string .Format( " {0}=to_date('{1}','yyyy-mm-dd'), " , dt.Columns[i].ColumnName, Convert.ToDateTime(originalValue).ToString( " yyyy-MM-dd " ));
                                }
                                
else
                                {
                                    insertValueString 
+=   string .Format( " NULL, " );
                                    updateValueString 
+=   string .Format( " {0}=NULL, " , dt.Columns[i].ColumnName);
                                }
                            }
                        }
                        insertValueString 
=  insertValueString.Trim( ' , ' );
                        updateValueString 
=  updateValueString.Trim( ' , ' ); 
                        
#endregion

                        
string  insertSql  =   string .Format( @" INSERT INTO tbpark_enterprise ({0}) VALUES({1}) " , insertColumnString, insertValueString);
                        
string  updateSql  =   string .Format( " Update tbpark_enterprise set {0} Where COMPANY_CODE='{1}'  " , updateValueString, COMPANY_CODE);
                        
string  checkExistSql  =   string .Format( " Select count(*) from tbpark_enterprise where COMPANY_CODE='{0}'  " , COMPANY_CODE);
                        
#endregion

                        
#region  写入数据
                        
try
                        {
                            com 
=   new  OracleCommand();
                            com.Connection 
=  conn;
                            com.CommandText 
=  checkExistSql;
                            
object  objCount  =  com.ExecuteScalar();

                            
bool  succeed  =   false ;
                            
bool  exist  =  Convert.ToInt32(objCount)  >   0 ;
                            
if  (exist)
                            {
                                
// 需要更新
                                
// WriteString(updateSql);
                                com.CommandText  =  updateSql;
                                succeed 
=  com.ExecuteNonQuery()  >   0 ;
                            }
                            
else
                            {
                                
// 需要插入
                                
// WriteString2(insertSql);
                                com.CommandText  =  insertSql;
                                succeed 
=  com.ExecuteNonQuery()  >   0 ;
                            }

                            
if  (succeed)
                            {
                                intOk
++ ;
                            }
                            
else
                            {
                                intFail
++ ;
                            }
                        }
                        
catch  (Exception ex)
                        {
                            intFail
++ ;
                            WriteString(com.CommandText);
                            LogHelper.Error(ex);
                            
break ;
                        }

                        
#endregion
                    }

                    
#region  关闭
                    
if  (conn  !=   null   &&  conn.State  !=  ConnectionState.Closed)
                    {
                        conn.Close();
                    }
                    
if  (com  !=   null )
                    {
                        com.Dispose();
                    }
                    
#endregion
                }
                
catch  (Exception ex)
                {
                    LogHelper.Error(ex);
                    MessageUtil.ShowError(ex.ToString());
                }

                
if  (intOk  >   0   ||  intFail  >   0 )
                {
                    
string  tips  =   string .Format( " 数据导入成功:{0}个,失败:{1}个 " , intOk, intFail);
                    MessageUtil.ShowTips(tips);
                }
            }
        }

 本文转自博客园伍华聪的博客,原文链接:批量Excel数据导入Oracle数据库,如需转载请自行联系原博主。



目录
相关文章
|
24天前
|
存储 缓存 数据库
数据库数据删除策略:硬删除vs软删除的最佳实践指南
在项目开发中,“删除”操作常见但方式多样,主要分为硬删除与软删除。硬删除直接从数据库移除数据,操作简单、高效,但不可恢复;适用于临时或敏感数据。软删除通过标记字段保留数据,支持恢复和审计,但增加查询复杂度与数据量;适合需追踪历史或可恢复的场景。两者各有优劣,实际开发中常结合使用以满足不同需求。
77 4
|
23天前
|
Oracle 安全 关系型数据库
【Oracle】使用Navicat Premium连接Oracle数据库两种方法
以上就是两种使用Navicat Premium连接Oracle数据库的方法介绍,希望对你有所帮助!
216 28
|
1月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的闪回数据库
Oracle闪回数据库功能类似于“倒带按钮”,可快速将数据库恢复至 earlier 状态,无需还原备份。本文介绍了闪回数据库的使用方法及实战案例:包括设置归档模式、开启闪回功能、记录SCN号、执行误操作后的恢复步骤等。通过具体 SQL 操作演示了如何利用闪回数据库恢复被误删的用户数据。注意,使用此功能前需确保数据库为归档模式。
|
2月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle数据库的闪回表
本文介绍了Oracle数据库中的闪回表(Flashback Table)功能,它能够将表的数据快速恢复到特定时间点或系统改变号(SCN),无需备份。文章通过实战示例详细演示了如何使用闪回表恢复数据,包括授权、创建测试表、记录时间与SCN号、删除数据、启用行移动功能、执行闪回操作以及验证恢复结果等步骤。同时,还展示了如何通过触发器禁止插入操作,并在闪回过程中处理触发器的启用问题。文末附有视频讲解,帮助读者更好地理解闪回表的使用方法。
79 10
|
2月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle数据库的闪回查询
本文介绍了Oracle数据库的闪回查询(Flashback Query)功能及其实际应用。闪回查询通过`AS OF`子句,结合时间戳或SCN号,可查询历史数据状态,帮助分析数据差异。文中通过具体示例演示了如何使用闪回查询:创建测试表、记录当前SCN号、更新数据并提交事务,最后通过闪回查询获取历史数据。附带的视频和代码块详细展示了操作步骤与结果。
|
24天前
|
人工智能 关系型数据库 分布式数据库
让数据与AI贴得更近,阿里云瑶池数据库系列产品焕新升级
4月9日阿里云AI势能大会上,阿里云瑶池数据库发布重磅新品及一系列产品能力升级。「推理加速服务」Tair KVCache全新上线,实现KVCache动态分层存储,显著提高内存资源利用率,为大模型推理降本提速。
|
3天前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
2月前
|
关系型数据库 MySQL Java
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
|
3天前
|
存储 关系型数据库 MySQL
大数据新视界 --面向数据分析师的大数据大厂之 MySQL 基础秘籍:轻松创建数据库与表,踏入大数据殿堂
本文详细介绍了在 MySQL 中创建数据库和表的方法。包括安装 MySQL、用命令行和图形化工具创建数据库、选择数据库、创建表(含数据类型介绍与选择建议、案例分析、最佳实践与注意事项)以及查看数据库和表的内容。文章专业、严谨且具可操作性,对数据管理有实际帮助。
大数据新视界 --面向数据分析师的大数据大厂之 MySQL 基础秘籍:轻松创建数据库与表,踏入大数据殿堂
|
2月前
|
关系型数据库 MySQL 数据库连接
docker拉取MySQL后数据库连接失败解决方案
通过以上方法,可以解决Docker中拉取MySQL镜像后数据库连接失败的常见问题。关键步骤包括确保容器正确启动、配置正确的环境变量、合理设置网络和权限,以及检查主机防火墙设置等。通过逐步排查,可以快速定位并解决连接问题,确保MySQL服务的正常使用。
374 82

推荐镜像

更多