2012-10-31 65 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来验证批量上传的数据并发送错误。如果有错误提醒用户,否则请执行批量复制或调用存储过程以将数据从临时表中提取到实际表中。

您选择。

相关问题