2016-03-30 8 views
0

SqlBulkCopyは私のローカルマシン上で完璧に取り組んでいるが、サーバー上の同じXLSXファイルと私ははインポートSqlBulkCopyでExcelファイルは

外部テーブルは予期された形式ではありません取得しています失敗します。

又は

なしエラーメッセージ、結果コード:E_FAIL(0x80004005の)。

このExcelファイルの行数は20.000を超えています。しかし、私は4000行で試してみると、それは動作しています。

私の接続文字列は以下の通りである:ここでは

<add name = "Excel07+ConString" connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0 Xml;HDR=YES'"/> 

はメインコード

string conString = string.Empty; 
     conString = ConfigurationManager.ConnectionStrings["Excel07+ConString"].ConnectionString; 
     conString = string.Format(conString, xlsFilePath); 
     using (OleDbConnection excel_con = new OleDbConnection(conString)) 
     { 
      excel_con.Open(); 
      string sheet1 = excel_con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null).Rows[0]["TABLE_NAME"].ToString(); 
      DataTable dtExcelData = new DataTable(); 
      dtExcelData.Columns.AddRange(new DataColumn[12] { 
      new DataColumn("Class", typeof(string)), 
      new DataColumn("Dia", typeof(double)), 
      new DataColumn("Unit", typeof(int)), 
      new DataColumn("Train", typeof(string)), 
      new DataColumn("Seq", typeof(string)), 
      new DataColumn("RevisionNo", typeof(int)), 
      new DataColumn("Fluid", typeof(string)), 
      new DataColumn("EngineeringTransCode", typeof(string)), 
      new DataColumn("Insulation", typeof(string)), 
      new DataColumn("PaintCode", typeof(string)), 
      new DataColumn("Pid", typeof(int)), 
      new DataColumn("RalCode", typeof(string)) 
      }); 
      using (OleDbDataAdapter oda = new OleDbDataAdapter("SELECT * FROM [" + sheet1 + "]", excel_con)) 
      { 
       oda.Fill(dtExcelData); 
      } 

      excel_con.Close(); 
      excel_con.Dispose(); 
      string consString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString; 
      using (SqlConnection con = new SqlConnection(consString)) 
      { 
       using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con)) 
       { 
        //Set the database table name 
        sqlBulkCopy.DestinationTableName = "dbo.XlsWlbIsometric"; 

        //[OPTIONAL]: Map the Excel columns with that of the database table 
        //sqlBulkCopy.ColumnMappings.Add("Id", "PersonId"); 
        sqlBulkCopy.ColumnMappings.Add("Class", "Class"); 
        sqlBulkCopy.ColumnMappings.Add("Dia", "Dia"); 
        sqlBulkCopy.ColumnMappings.Add("Unit", "Unit"); 
        sqlBulkCopy.ColumnMappings.Add("Train", "Train"); 
        sqlBulkCopy.ColumnMappings.Add("Seq", "Seq"); 
        sqlBulkCopy.ColumnMappings.Add("RevisionNo", "RevisionNo"); 
        sqlBulkCopy.ColumnMappings.Add("Fluid", "Fluid"); 
        sqlBulkCopy.ColumnMappings.Add("EngineeringTransCode", "EngineeringTransCode"); 
        sqlBulkCopy.ColumnMappings.Add("Insulation", "Insulation"); 
        sqlBulkCopy.ColumnMappings.Add("PaintCode", "PaintCode"); 
        sqlBulkCopy.ColumnMappings.Add("Pid", "Pid"); 
        sqlBulkCopy.ColumnMappings.Add("RalCode", "RalCode"); 
        con.Open(); 
        sqlBulkCopy.WriteToServer(dtExcelData); 
        sqlBulkCopy.Close(); 
        con.Close(); 
        con.Dispose(); 
       } 
      } 


     } 

されており、ここに私が受け取った例外です。申し訳ありませんが、私はこれを文字列形式で取得できます。

System.Data.OleDb.OleDbException(0x80004005):外部テーブルが予期しない形式です。 System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptionsオプション、DbConnectionPoolKey poolKey、Object poolGroupProviderInfo、DbConnectionPoolプール、DbConnection owningObject)のSystem.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr、OleDbConnection接続)でSystem.Data.ProviderBase .DbConnectionFactory.CreateConnection(DbConnectionOptionsオプション、DbConnectionPoolKey poolKey、Object poolGroupProviderInfo、DbConnectionPoolプール、DbConnection owningConnection、DbConnectionOptions userOptions)System.Data.ProviderBaseのSystem.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection、DbConnectionPoolGroupプールグループ、DbConnectionOptionsユーザーオプション) DbConnectionFactory.TryGetConnection(DbConnection owningConnection、TaskCompletionSource 1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource、再試行、DbConnectionOptions userOptions)System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnectionのouterConnection 、DbConnectionFactory connectionFactory、TaskCompletionSource`1 retry、DbConnectionOptions userOptions)をSystem.Data.OleDb.OleDbConnection.Open()のSystem.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection outerConnection、DbConnectionFactory connectionFactory)のGenWork.Areas.Xls.Controllersに保存します。 XlsIsometricController.ParseImportedExcel(文字列xlsFilePath、のInt32 xlsWlbIsometricMasterId)

+0

例外はどこに発生しますか? *なぜあなたはそれが行の数と関係していると思いますか?あなたは2つの異なるファイルを試しましたが、そのメッセージはファイル形式*に準拠しています。コールスタックを含む*完全な例外を投稿してください。あなたは 'exception.ToString()' –

+0

BTWでそれを簡単に得ることができます。これは、Excelシートの場合でも*小さな*数の行です。ファイルのフォーマットは何ですか?どのように作成されましたか?それは実際のExcelファイルか、アプリケーションから生成されたExcel拡張機能付きのCSV/HTMLですか? –

+0

[この重複する質問](http://stackoverflow.com/questions/1139390/excel-external-table-is-not-in-the-expected-format)に示すように、このエラーはExcelファイルを読み込もうとしているときに発生します間違ったバージョン番号を使用しています。あなたは 'xls'ファイルを読み込もうとしていますか? –

答えて

0

の詳細情報を持たずに、私は、問題は、あなたが操作をバッチ処理されていないことであると仮定します。 SqlBulkCopyには、設定可能なバッチサイズプロパティがあります。コードを投稿していないので、設定していれば明確ではありません。そうでない場合は、5,000〜10,000に設定してもう一度試してください。

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.batchsize.aspx

または第四千行後のデータに問題がある可能性があります。そうしていない場合は、SqlBulkCopyコードをtry/catchにラップして、おそらく内部の例外に詳細があるかどうかを確認してください。おそらくトランザクションを使うことも良い考えです。

https://msdn.microsoft.com/en-us/library/tchktcdk(v=vs.110).aspx

+0

こんにちは、お返事ありがとうございます。 BatchSizeが設定されていないようです。私は自分のコードを追加しました。 – umki

+0

バッチ処理またはその欠落は、特にこのような少数の行についてエラーを引き起こすことはありません。また、エラーは、Excelのファイルについては、SQL Server –

+0

ではなく、同意していますが、元の投稿には十分な文脈がありませんでした。それでなぜ私は例外をより深く見てみることを提案したのですか? –

関連する問題