日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

批量Excel数据导入Oracle数据库

發布時間:2025/5/22 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 批量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);
????????????????}
????????????}
????????}

?

以上代碼,為了方便,使用了輸出腳本的方式進行驗證對比,一般情況下也是用得著的。

最后附上該程序的源碼,和大家分享學習:http://files.cnblogs.com/wuhuacong/ImportExcelToOracle.rar?

轉載于:https://www.cnblogs.com/wuhuacong/archive/2010/04/28/1723142.html

總結

以上是生活随笔為你收集整理的批量Excel数据导入Oracle数据库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。