2017-02-09 19 views
1

次のコードを使用してasp.net c#でExcelファイルをアップロードしています。問題なく動作していますが、Excelファイルでは列の値が常に数値で、テキスト形式で、それはヌル値をアップロードしています。これは私のコードです - どんな提案もお願いします。Excel asp.netでSqlBulkCopyを使用してファイルをアップロード

if (!Convert.IsDBNull(FileUpload.PostedFile) & 
    FileUpload.PostedFile.ContentLength > 0) 
{ 
    //FIRST, SAVE THE SELECTED FILE IN THE ROOT DIRECTORY. 
    FileUpload.SaveAs(Server.MapPath(".") + "\\" + FileUpload.FileName); 
    // File.Delete(Server.MapPath(FileUpload.FileName)); 
    SqlBulkCopy oSqlBulk = null; 

    // SET A CONNECTION WITH THE EXCEL FILE. 
    OleDbConnection myExcelConn = new OleDbConnection(
     "Provider=Microsoft.ACE.OLEDB.12.0; " + 
     "Data Source=" + Server.MapPath(".") + "\\" + FileUpload.FileName + 
     ";Extended Properties=Excel 12.0;"); 
    try 
    { 
     myExcelConn.Open(); 

     // GET DATA FROM EXCEL SHEET. 
     OleDbCommand objOleDB = 
      new OleDbCommand("SELECT SSS.*,'" + Session["vUserName"].ToString() + "' FROM [Sheet1$] SSS", myExcelConn); 

     // READ THE DATA EXTRACTED FROM THE EXCEL FILE. 
     OleDbDataReader objBulkReader = null; 
     objBulkReader = objOleDB.ExecuteReader(); 

     // SET THE CONNECTION STRING. 
     // con = new SqlConnection(dbcon); 

     using (con = new SqlConnection(dbcon)) 
     { 
      con.Open(); 

      // FINALLY, LOAD DATA INTO THE DATABASE TABLE. 
      oSqlBulk = new SqlBulkCopy(con); 
      oSqlBulk.DestinationTableName = "tmpStuffing"; // TABLE NAME. 

      oSqlBulk.WriteToServer(objBulkReader); 
     } 

     lblConfirm.Text = "DATA IMPORTED SUCCESSFULLY."; 
     lblConfirm.Attributes.Add("style", "color:green"); 
    } 
    catch (Exception ex) 
    { 
     lblConfirm.Text = ex.Message; 
     lblConfirm.Attributes.Add("style", "color:red"); 
    } 
    finally 
    { 
     // CLEAR. 
     oSqlBulk.Close(); 
     oSqlBulk = null; 
     myExcelConn.Close(); 
     myExcelConn = null; 
    } 
} 
+0

あなたのクエリですべてのデータが返されましたか? –

+0

@NayanKatkani無関係。これは型変換の問題です。 – Corey

+0

@Corey、型変換の問題であれば例外をスローします –

答えて

0

こんにちは私は、既存のコードの次のセクションを変更する問題を解決しました。私はIMEX=1;ImportMixedTypes=Text;TypeGuessRows=0'考える

"Provider=Microsoft.ACE.OLEDB.12.0; " + 
         "Data Source=" + Server.MapPath(".") + "\\" + FileUpload.FileName + 
         ";Extended Properties='Excel 12.0;IMEX=1;ImportMixedTypes=Text;TypeGuessRows=0';" 

は、混合データ型をインポートするためのトリックを行います。

ありがとうございました

0

は楽しさとExcelの癖に対処するための刺激的な世界へようこそ、そしてなぜそれがデータソースとしてExcelスプレッドシートを使用することが悪い考えです。悲しいことに、この1つは、仕事の権利を得るためにあなたの部分でもう少し作業をするつもりです。

各行を確認し、各列に応じて型変換を実行する必要があります。最も単純なのは、ソースデータをDataTableに読み込み、WriteToServerメソッドに渡すことです。

だから...互換DataTableを作成し、フィールドデータを読み取るために進めるためにRead()を使用して、さまざまなGet*()方法オーレIDataReaderインスタンス間で反復することによってそれを埋めます。文字列であるため数値を読み取ることができない場合は、Int32.TryConvert(...)または類似の文字列を使用して文字列を正しい数値形式に変換します。データの最後(Read()がfalseを返す)に達すると、上記のようにSqlBulkCopyを使用してDataTableをSQLサーバーにダンプできます。

int? num = (reader.Item[1] as int?) ?? ParseInt(reader.GetString(1)); 

はまた、あなたが可能な場合は、変換を行うために拡張メソッドを使用することができます:

つのショートカットは、型変換を呼び出すために型エラーと?? null合体演算子を検出するasキーワードを使用することです

public static int? AsInt32(this IDataReader rdr, int index) 
{ 
    Type ft = rdr.GetFieldType(index); 
    if (ft == typeof(int)) 
     return rdr.GetInt32(index); 
    else if (ft == typeof(string)) 
    { 
     int v; 
     if (Int32.TryParse(rdr.GetString(index), out v)) 
      return v; 
    } 
    else if (ft == typeof(object)) 
    { 
     object fv = rdr.GetValue(index); 
     int? v = fv as int?; 
     if (v != null) 
      return v.Value; 
    } 

    return null; 
} 

(かなり単純である)AsStringのための同様のものを追加し、あなたがトンのようなものを使用してDataTableにあなたのエクセルIDataReaderを変換することができます彼:

public DataTable ImportData(IDataReader reader) 
{ 
    DataTable table = new DataTable(); 
    table.Columns.Add("ID", typeof(int)); 
    table.Columns.Add("UserName", typeof(string)); 

    int rownum = 0; 
    while (reader.Read()) 
    { 
     ++rownum; 
     int? id = reader.AsInt32(0); 
     if (id == null) 
      throw new Exception(string.Format("Invalid ID on row {0}, value: {1}", rownum, reader.GetValue(0))); 

     string name = reader.AsString(1); 

     table.Rows.Add(id.Value, name); 
    } 

    return table; 
} 
関連する問題