SqlBulkCopyを使用してExcelファイルをインポートできない

asp.net c# excel sqlbulkcopy

質問

SqlBulkCopyはローカルマシン上で完璧に動作していますが、サーバ上の同じxlsxファイルを使用しています。

外部表が予期された形式ではありません。

または

エラーメッセージは使用できません。結果コード: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 1 retry、DbConnectionOptions userOptions)をSystem.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection外部接続、DbConnectionFactory接続ファクトリ、TaskCompletionSource`1再試行、DbConnectionOptionsユーザーオプション)で行います。 (DbConnection outerConnection、DbConnectionFactory connectionFactory)、System.Data.OleDb.OleDbConnection.Open()、GenWork.Areas.Xls.Controllers.XlsIsometricController.ParseImportedExcel(String xlsFilePath、Int32 xlsWlbIsometricMasterId)

人気のある回答

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

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

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

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



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ