2014-11-06 94 views
0

我试图导入excel文件到我的网站,然后将其内容保存在sql服务器 我的问题与sqlbulkcopy当它填充数据库的一些列填充错误值是NULL!而列中有一个非空的double值!SqlBulkCopy插入null而不是双重

这里是代码:

  void ImporttoDatatable() 
{ 

    try 
    { 
     if (FileUpload3.HasFile) 
     { 
      string FileName = FileUpload3.FileName; 
      string path = Path.Combine(Server.MapPath("~/ImportDocument"), Guid.NewGuid().ToString() + Path.GetExtension(FileUpload3.PostedFile.FileName)); 


      FileUpload3.PostedFile.SaveAs(path); 




      using (OleDbConnection OleDbcon = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + "; Extended Properties = \"Excel 8.0;HDR=Yes;IMEX=2\" ")) 
      { 


       conn.Open(); 
       OleDbcon.Open(); 
       OleDbCommand command = new OleDbCommand("Select [IdOftable], [Time],[InstrumentLeftHand],[LeftSwitch],[LeftKnob],[ForceFeedbackLeftHand],[CumTimeLeftForceOverThreshold],[CumTimeLeftForceOver2xThreshold],[TranslationLeft_x],[TranslationLeft_y],[TranslationLeft_z],[quatLeft_x],[quatLeft_y],[quatLeft_z],[quatLeft_w],[InstrumentRightHand],[RightSwitch],[RightKnob],[ForceFeedbackRightHand],[CumTimeRightForceOverThreshold],[CumTimeRightForceOver2xThreshold],[TranslationRight_x],[TranslationRight_y],[TranslationRight_z],[quatRight_x],[quatRight_y],[quatRight_z],[quatRight_w],[BloodEmittedFrame],[BloodCurrentFrame],[TotalBloodEmitted],[TotalWhiteFibreCut],[TotalRedFibreCut],[Volume0_Brain],[Volume1_Tumor],[Volume2_Tumor] from [Sheet1$]", OleDbcon); 

       //OleDbDataAdapter objAdapter1 = new OleDbDataAdapter(command); 
       DbDataReader dr = command.ExecuteReader(); 
       using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn)) 
       { 
       bulkCopy.DestinationTableName = "MyExcel"; 
        try 
        { 
         bulkCopy.BulkCopyTimeout = 400; 
         bulkCopy.WriteToServer(dr); 
         bulkCopy.BatchSize = 16000; 
        } 
        catch (Exception ex) 
        { 
         Response.Write(ex.ToString()); 
        } 
        finally 
        { 
         dr.Close(); 
        } 
        OleDbcon.Close(); 
        bulkCopy.Close(); 

       } 
      } 
     } lblmessage.Text = "The File Succssesfully Imported "; 
    } 
    catch (Exception ex) 
    { 
     Response.Write(ex.ToString()); 
    } 
} 

,这是SQL表定义:

 CREATE TABLE [dbo].[MyExcel] (
[IdOftable]      NVARCHAR (50) NOT NULL, 
[Time]        FLOAT (53) NULL, 
[InstrumentLeftHand]    NVARCHAR (50) NULL, 
[LeftSwitch]      FLOAT (53) NULL, 
[LeftKnob]       FLOAT (53) NULL, 
[ForceFeedbackLeftHand]   FLOAT (53) NULL, 
[CumTimeLeftForceOverThreshold] FLOAT (53) NULL, 
[CumTimeLeftForceOver2xThreshold] FLOAT (53) NULL, 
[TranslationLeft_x]    FLOAT (53) NULL, 
[TranslationLeft_y]    FLOAT (53) NULL, 
[TranslationLeft_z]    FLOAT (53) NULL, 
[quatLeft_x]      FLOAT (53) NULL, 
[quatLeft_y]      FLOAT (53) NULL, 
[quatLeft_z]      FLOAT (53) NULL, 
[quatLeft_w]      FLOAT (53) NULL, 
[InstrumentRightHand]    NVARCHAR (50) NULL, 
[RightSwitch]      FLOAT (53) NULL, 
[RightKnob]      FLOAT (53) NULL, 
[ForceFeedbackRightHand]   FLOAT (53) NULL, 
[CumTimeRightForceOverThreshold] FLOAT (53) NULL, 
[CumTimeRightForceOver2xThreshold] FLOAT (53) NULL, 
[TranslationRight_x]    FLOAT (53) NULL, 
[TranslationRight_y]    FLOAT (53) NULL, 
[TranslationRight_z]    FLOAT (53) NULL, 
[quatRight_x]      FLOAT (53) NULL, 
[quatRight_y]      FLOAT (53) NULL, 
[quatRight_z]      FLOAT (53) NULL, 
[quatRight_w]      FLOAT (53) NULL, 
[BloodEmittedFrame]    NVARCHAR (50) NULL, 
[BloodCurrentFrame]    FLOAT (53) NULL, 
[TotalBloodEmitted]    FLOAT (53) NULL, 
[TotalWhiteFibreCut]    FLOAT (53) NULL, 
[TotalRedFibreCut]     FLOAT (53) NULL, 
[Volume0_Brain]     FLOAT (53) NULL, 
[Volume1_Tumor]     FLOAT (53) NULL, 
[Volume2_Tumor ]     FLOAT (53) NULL, 
PRIMARY KEY CLUSTERED ([IdOftable] ASC) 
); 

有,当我跑的代码,但没有例外,当我检查了数据的服务器里面有一些值不为空值=(

我使用visual studio express 2012 for web。怎么办才能纠正它?

谢谢

+0

但除了一个所有的字段可以有NULL值... – e4rthdog 2014-11-06 08:38:02

+0

我没有检查的'SqlBulkCopy.WriteToServer(IDataReader的)内部工作',但我的猜测是,由于从电子表格读不给一个强类型的读者,在那里我是一个相当宽松的转换器,在转换失败时使用'DbNull'。我昨天遇到了这个问题,并发现添加额外的代码来显式迭代读者,并用显式转换填充一个强类型的'DataTable',然后将这个表写入服务器的速度比试图反映.NET更快准确找出发生这种情况的原因。 – GarethD 2014-11-06 08:40:07

+0

@ e4rthdog谢谢你的回复,但是当我改变它不为null异常“system.invalidoperationexception列”列名'不允许dbnull.value“会出现这意味着相同的问题出来与null或没有它=( – seetah 2014-11-06 09:33:20

回答

0

感谢大家的帮助 终于它与我的作品时,我用什么@GarethD

我会后编辑的代码在任何人的情况下,需要:

string name = (string)(Session["LoginUserName"]); 
    if(FileUpload3.FileName == null){ 

    lblmessage.Text = "Choose the file First then click import "; 
    string display = "    Choose the file First then click import     "; 
    ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" + display + "');", true); 
    } 
    else 
    { 


     string path = Path.Combine(Server.MapPath("~/ImportDocument"), Guid.NewGuid().ToString() + name + Path.GetExtension(FileUpload3.PostedFile.FileName)); 


    FileUpload3.PostedFile.SaveAs(path); 
    OleDbConnection dbConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + "; Extended Properties = \"Excel 8.0;HDR=Yes;IMEX=2\" "); 
    dbConnection.Open(); 
    try 
    {  

     // Get the name of the first worksheet: 
     DataTable dbSchema = dbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 
     if (dbSchema == null || dbSchema.Rows.Count < 1) 
     { 
      throw new Exception("Error: Could not determine the name of the first worksheet."); 
     } 
     string firstSheetName = dbSchema.Rows[0]["TABLE_NAME"].ToString(); 

     // Now we have the table name; proceed as before: 
     OleDbCommand dbCommand = new OleDbCommand("Select [IdOftable], [Time],[InstrumentLeftHand],[LeftSwitch],[LeftKnob],[ForceFeedbackLeftHand],[CumTimeLeftForceOverThreshold],[CumTimeLeftForceOver2xThreshold],[TranslationLeft_x],[TranslationLeft_y],[TranslationLeft_z],[quatLeft_x],[quatLeft_y],[quatLeft_z],[quatLeft_w],[InstrumentRightHand],[RightSwitch],[RightKnob],[ForceFeedbackRightHand],[CumTimeRightForceOverThreshold],[CumTimeRightForceOver2xThreshold],[TranslationRight_x],[TranslationRight_y],[TranslationRight_z],[quatRight_x],[quatRight_y],[quatRight_z],[quatRight_w],[BloodEmittedFrame],[BloodCurrentFrame],[TotalBloodEmitted],[TotalWhiteFibreCut],[TotalRedFibreCut],[Volume0_Brain],[Volume1_Tumor],[Volume2_Tumor] from [" + firstSheetName + "]", dbConnection); 
     OleDbDataReader dbReader = dbCommand.ExecuteReader(); 

     using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn)) 
     { 

      bulkCopy.DestinationTableName = "MyExcel"; 
      try 
      { 
       conn.Open(); 
       bulkCopy.BulkCopyTimeout = 400; 
       bulkCopy.WriteToServer(dbReader); 
       bulkCopy.BatchSize = 16000; 
       conn.Close(); 

      } 

      catch (Exception ex) 
      { 
       Response.Write(ex.ToString()); 
      } 
      finally 
      { 
       bulkCopy.Close(); 
       dbReader.Close(); 
       //lblmessage.Text = " data successfully imported "; 
      // Response.Write(@"<script language=""javascript"">alert('Details saved successfully')</script>"); 
       string display = "    Data Duccessfully Imported Now Click On Calculate the result to calculate your results taking in your account The calculation will take a while , please wait "; 
       ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" + display + "');", true); 
      } 



     } 
    } 
    finally 
    { 
     dbConnection.Close(); 
    } 
}