2017-01-02 83 views
0

我正在读excel有像百万条记录先查询我的表(无记录),并获得Datable。我查询我的表来获取列名称定义在我的Excel表中使用别名。如何从Excel中插入数据到包含头文件的数据表?

var dal = new clsConn(); 

       var sqlQuery = "SELECT FETAPE_THEIR_TRANDATE \"Date\" ,ISSUER Issuer, ISSU_BRAN Branch , STAN_NUMB STAN, TERMID TermID, ACQUIRER Acquirer,DEBIT_AMOUNT Debit,CREDIT_AMOUNT Credit,CARD_NUMB \"Card Number\" , DESCRIPTION Description FROM ALLTRANSACTIONS"; 
       var returntable = dal.ReadData(sqlQuery); 
       DataRow ds = returntable.NewRow(); 
       var dtExcelData = returntable; 

所以,我的数据表看起来像这样,

enter image description here

然后,我从Excel工作表中读取记录

OleDbConnection con = null; 
       if (ext == ".xls") 
       { 
        con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filepath + ";Extended Properties=Excel 8.0;"); 

       } 
       else if (ext == ".xlsx") 
       { 
        con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + ";Extended Properties=\"Excel 12.0;IMEX=2;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text\""); 
       } 
       con.Open(); 
       dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 
       string getExcelSheetName = dt.Rows[0]["Table_Name"].ToString(); 
       //OleDbCommand ExcelCommand = new OleDbCommand(@"SELECT * FROM [" + getExcelSheetName + @"]", con); 
       OleDbCommand ExcelCommand = new OleDbCommand("SELECT F1, F2, F3, F4, F5,F6,F7,F8,F9,F10 FROM [Sheet1$]", con); 

       OleDbDataAdapter ExcelAdapter = new OleDbDataAdapter(ExcelCommand); 

       try 
       { 
        ExcelAdapter.Fill(dtExcelData); //Here I give the datatable which i made previously 
       } 
       catch (Exception ex) 
       { 
        //lblAlert2.CssClass = "message-error"; 
        //lblAlert2.Text = ex.Message; 
       } 

它成功地读取和数据表中填写的数据,但创建其自己的列在像F1到F10这样的数据表中,我如何将这些数据移动到与我在数据表中定义的列完全匹配

enter image description here

我将如何管理这种不创建其他列(F1,f2..f10) 任何解决办法将是可观的或请解释什么,我做错了,我怎么能做到这一点。

UPDATE: 我的Excel文件看起来像这样

enter image description here

+0

你的excel是怎样的?快照会有所帮助。 – Spidey

+0

为什么使用'选择F1,F2,F3,F4,F5,F6,F7,F8,F9,F10 FROM [Sheet1 $]'而不是'从[Sheet1 $]'选择*? – Spidey

+0

我试过这两个查询,两者都给出了相同的结果 –

回答

1

的Microsoft.ACE.OLEDB.12.0驱动程序将处理两种类型的Excel电子表格,并使用相同的扩展属性。即“Excel 12.0”将打开.xls和.xlsx。

离开HDR = NO作为OLEDB希望他们在第一行中,他们实际上是在连续11

可悲的是“TypeGuessRows = 0; ImportMixedTypes =文本”完全被忽略Microsoft.ACE.OLEDB.12.0 ,你必须玩弄注册表(yuk)。将IMEX = 2更改为IMEX = 1,以确保将混合数据类型处理为文本。

回到使用“选择*从[Sheet1 $]”,然后我非常担心你将不得不手动处理源数据。

OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + ";Extended Properties=\"Excel 12.0;IMEX=1;HDR=NO\""); 
con.Open(); 

DataTable dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 

string getExcelSheetName = (string)dt.Rows[0]["Table_Name"]; 

DataTable xlWorksheet = new DataTable(); 

xlWorksheet.Load(new OleDbCommand("Select * From [" + getExcelSheetName + "]", con).ExecuteReader()); 

//More than 11 rows implies 11 header rows and at least 1 data row 
if (xlWorksheet.Rows.Count > 11 & xlWorksheet.Columns.Count >= 10) 
{ 
    for (int nRow = 11; nRow < xlWorksheet.Rows.Count; nRow++) 
    { 
     DataRow returnRow = returntable.NewRow(); 

     for (int nColumn = 0; nColumn < 10; nColumn++) 
     { 
      //Note you will probably get conversion problems here that you will have to handle 
      returnRow[nColumn] = xlWorksheet.Rows[nRow].ItemArray[nColumn]; 
     } 
     returntable.Rows.Add(returnRow); 
    } 
} 

我猜你只是想添加excel数据到你的ALLTRANSACTION表?你没有指定,但似乎这可能是结果。如果是这样,这是一个可怕的方式来做到这一点。您不需要将整个表读入内存追加数据,然后更新数据库。您只需读取excel文件并将数据插入Oracle表格即可。

有些想法,你的可归还将包含数据,所以如果你只是想要表的结构,然后在Select语句中添加一个“Where RowNum = 0”。要将数据添加到Oracle数据库,您可以1)转换为使用Oracle数据提供程序(ODP),然后使用OracleBulkCopy Class或2)只需修改上述内容以在读取数据时逐行插入。只要您的Excel电子表格中没有大量数据,它就可以正常工作。说了百万行是很多,所以也许不是最好的选择。您将需要验证输入,因为Excel并非真正的最佳数据源。

相关问题