2011-08-17 61 views
1

我正在從Excel表導入數據到數據庫。我能夠成功地將數據從excel導入到database.i想知道如何添加只有新行從Excel表格到數據庫,而無需添加以前的數據。如何只插入新行從Excel表到數據庫

  for (int i = 0; i < exceltable.Rows.Count; i++) 
      { 
       if (i > 1) 
       { 
        DataRow row = exceltable.Rows[i]; 
        object ID = row[0].ToString(); 


        if (ID != null && !String.IsNullOrEmpty(ID.ToString().Trim())) 
        { 
         Int16 CustID = Convert.ToInt16(ID); 
         string CustName = row[1].ToString(); 
         string CardScheme = row[2].ToString(); 
         string Outlet = row[3].ToString(); 
         string TerminalNum = row[4].ToString(); 
         Int32 Terminal = Convert.ToInt32(TerminalNum); 

         string Date1 = row[5].ToString(); 
         DateTime Date = Convert.ToDateTime(Date1); 

         string Time = row[6].ToString(); 
         DateTime DateTime = Convert.ToDateTime(Time); 

         string Amount1 = row[7].ToString(); 
         double Amount = Convert.ToDouble(Amount1); 

         string columnNames = "CustID,CustName,CardScheme,Outlet,TerminalNum,TranDate,TranDateTime,Amount"; 
         string query1 = String.Format("insert into customer({0})values ('{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}')", columnNames, CustID, CustName, CardScheme, Outlet, Terminal, Date, DateTime, Amount); 
         SqlCommand com = new SqlCommand(query1, connection); 
         com.ExecuteNonQuery(); 

        } 
        **// else if (i==exceltable.Rows[exceltable.Rows.Count-1]-1) 
        //{ 
        // DataRow Newrow = exceltable.NewRow(); 
        // Newrow["CustID"] = row[0].ToString(); 
        // Newrow["CustName"] = row[1].ToString(); 
        // Newrow["CardScheme"] = row[2].ToString(); 
        // Newrow["Outlet"] = row[3].ToString(); 
        // Newrow["TerminalNum"] = row[4].ToString(); 
        // Newrow["TranDate"] = row[5].ToString(); 
        // Newrow["TranDateTime"] = row[6].ToString(); 
        // Newrow["Amount"] = row[7].ToString(); 
        // exceltable.Rows.Add(Newrow); 
        // exceltable.AcceptChanges(); 

        //}** 

       } 

      } 


       DataRow lastrow=exceltable.Rows[exceltable.Rows.Count-1]; 
       if(!String.IsNullOrEmpty(lastrow.ToString().Trim())) 
       { 
        string Count = lastrow[4].ToString(); 
        Int16 TotalRows = Convert.ToInt16(Count); 
        string Sum = lastrow[7].ToString(); 
        double TotalAmount = Convert.ToDouble(Sum); 

        SqlCommand cmd = new SqlCommand("insert into tblExcel(TotalRows,TotalAmount) values('"+TotalRows+"','"+TotalAmount+"')",connection); 
        cmd.ExecuteNonQuery(); 
       }     

       return true; 
     } 

現在我想一些guidance..above代碼插入來自Excel工作表中的數據database..now我想知道我是否需要添加代碼的代碼中插入新行或我需要添加別的地方,我也嘗試過使用NewRow()方法的數據表,我已經在評論中標記,因爲我對它有懷疑。在我走向正確的方向時。請指導我。

回答

0

AFAIK沒有直接的解決方案。你必須想出一些關於這個的技巧。 我可能會這樣做,知道到目前爲止我已經插入了多少條記錄(假設新記錄被插入到最後),然後從該數字開始的任何記錄都將被添加到數據庫中。

2

您需要根據數據庫中的數據檢查數據。 應該有一個密鑰,使該行是唯一的。

var row = RowFromExcel(); //Row from Excel 
var uniqueKey = row.Key; 

if (!FindRowInDbWithKeyExists(uniqueKey)) 
{ 
    //If not found in Db then insert new row. 
} 
+0

你可以解釋我RowFromExcel()和row.Key是什麼意思..是一個屬性.. – Nazima

+0

@Nazima,RowFromExcel()是一種方法,它將返回一個類或只是一個值列表,基本上每個excel行中的excel單元格。 row.Key是哪個單元格使該行唯一。所以我們可以說你正在回顧一個List String,並且讓這一行唯一的單元格是第二個單元格,你會這樣做。 var uniqueKey = rows [1]; <=獲取第二個值。希望這是有道理的。 – Jethro

0

你爲什麼不上傳數據表到一個臨時表。只需運行刪除語句即可刪除已存在於主數據庫表中的行。然後您可以插入剩餘的新行。

1

你沒有指定你正在使用的數據庫,你可以選擇在插入時忽略重複記錄,你的表必須有一個主鍵。

對於oracle(11g),可以使用ignore_row_on_dupkey_index提示和insert語句。
對於SQL Server,您需要創建索引IGNORE_DUP_KEY
對於MySQL,您可以使用IGNORE提示和插入語句。

您將不得不每次都處理整個excel表格,但只有新行將被插入到表格中。

相關問題