2012-10-31 90 views
0

我正在導入Excelsheet到sql服務器數據庫中,我需要檢查某些東西在導入工作表之前,例如我有一個名爲Passport的列,它必須具有僅以字母開頭的值,並且必須將剩餘的字符作爲數字(僅限於)。如何比較使用SqlBulkCopy時excel單元格值的值?

DataTable dt7 = new DataTable(); 
      dt7.Load(dr); 
      DataRow[] ExcelRows = new DataRow[dt7.Rows.Count]; 
      // Bulk Copy to SQL Server 

      using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnectionString)) 
      { 
       bulkCopy.DestinationTableName = "ExcelTable"; 
       dt7.Rows.CopyTo(ExcelRows, 0); 

       for (int i = 0; i < ExcelRows.Length; i++) 
       { 
        if (ExcelRows[i]["data"] == DBNull.Value) 
        { 
         // Include any actions to perform if there is no date 
         //ExcelRows[i]["data"] = Convert.ToString(0); 
        } 
        else 
        { 
         DateTime oldDate = Convert.ToDateTime(ExcelRows[i]["data"]).Date; 
         DateTime newDate = Convert.ToDateTime(oldDate).Date; 
         ExcelRows[i]["data"] = newDate.ToString("yyyy/MM/dd"); 
        } 



       } 
       bulkCopy.WriteToServer(ExcelRows); 
+0

哪裏是上面代碼中的護照欄? – andy

+0

所以你需要在BCP之前檢查它?使用查詢/ SP在數據庫中執行它可以嗎?因爲使用SQL Server內置函數應該相對簡單。 – OzrenTkalcecKrznaric

+0

@Anandkumar它不是我要添加護照我,我剛剛發佈了這段代碼,以顯示我用什麼方法上傳excel – Arbaaz

回答

0

簡單的答案是'NO'。在執行SqlBulk操作時無法驗證。你可以做的是在執行SqlBulk操作之前驗證Datatable

private bool Validate(Datatable dt) 
{ 
    //Perform your validation 
    // return true/false 
} 

     DataTable dt7 = new DataTable(); 
     dt7.Load(dr); 
     DataRow[] ExcelRows = new DataRow[dt7.Rows.Count]; 
     // Bulk Copy to SQL Server 

     // Perform your validation here. If not validated then skip with some message. 
     if(!Validate(dt7)) 
     { 
      //Show Message 
      return; 
     }    

     using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnectionString)) 
     { 
      bulkCopy.DestinationTableName = "ExcelTable"; 
      dt7.Rows.CopyTo(ExcelRows, 0); 

      for (int i = 0; i < ExcelRows.Length; i++) 
      { 
       if (ExcelRows[i]["data"] == DBNull.Value) 
       { 
        // Include any actions to perform if there is no date 
        //ExcelRows[i]["data"] = Convert.ToString(0); 
       } 
       else 
       { 
        DateTime oldDate = Convert.ToDateTime(ExcelRows[i]["data"]).Date; 
        DateTime newDate = Convert.ToDateTime(oldDate).Date; 
        ExcelRows[i]["data"] = newDate.ToString("yyyy/MM/dd"); 
       } 



      } 
      bulkCopy.WriteToServer(ExcelRows); 
1

不,你不能。你可以做的是在批量操作之前進行驗證。

+0

這正是我想要做的,但問題是如何? – Arbaaz

0

您希望在上載Excel表單時驗證excel單元格值。 兩種方式:

  1. 把Excel數據在一個DataTable,並通過它做驗證和記錄不符運行。完成驗證後,向用戶顯示錯誤,或者如果沒有更多的錯誤,請執行sqlbulkcopy。所有這些都是在C#級完成的。

  2. 在sql的前端,將Excel數據放入數據表do sqlbulkcopy直接在數據庫的臨時表中。然後調用存儲的proc來驗證批量上傳的數據併發送錯誤。如果有錯誤提醒用戶,否則請執行批量複製或調用存儲過程以將數據從臨時表中提取到實際表中。

您選擇。

相關問題