0

Excel ファイル (.xlsx) があり、ファイルの内容を SQL サーバー テーブルにアップロードしようとしています。SQL 一括コピーを使用してデータを一括挿入しています。データはテーブルに挿入されますが、データが正しく挿入されていません。

これがサンプルのExcelデータです-

ここに画像の説明を入力

これは、Sql 一括コピーのコードです。

string fname = Path.GetFileName(fup_addRoute.FileName);
fup_addRoute.SaveAs(Server.MapPath("/Admin/UserRoutes/" + fname));
string path = Server.MapPath("/Admin/UserRoutes/" + fname);
                    
using (OleDbConnection connection = new OleDbConnection(string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 8.0", path)))
{
      OleDbCommand command = new OleDbCommand("select * from [Sheet1$]", connection);
      connection.Open();
      System.Data.Common.DbDataReader dr = command.ExecuteReader();
      SqlBulkCopy bulkInsert = new SqlBulkCopy(con); 
      bulkInsert.DestinationTableName = "routesdata";
      bulkInsert.WriteToServer(dr);
      connection.Close();
      dr.Close();
      bulkInsert.Close();
}

挿入後のデータ:

ここに画像の説明を入力

最後の行のみが挿入され、Excel シートの最初の列の値が欠落しています。表の xid 列は自動インクリメント列です。

この手順はMySqlでは「load data infile」で簡単でしたが、SQLサーバーに移行しただけです。私のコードで何が間違っていますか。提案してください。

4

2 に答える 2

3

以前のコメントのフォローアップとして、最初の行だけが欠けているHDR=Noため、接続文字列に追加する必要があるようです。

次のようになります。

Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR=No';

- 編集

追加されたアポストロフィに注意してください。

幸運を。

于 2013-02-03T04:30:48.960 に答える
2

あなたが例外を報告していないことに、私は実際に少し驚いています。

いずれにせよ、(少なくとも一部の) 問題は、列のマッピングを指定する必要があることだと思います。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopycolumnmapping.aspxから

マッピングが定義されていない場合 (つまり、ColumnMappings コレクションが空の場合)、列は序数の位置に基づいて暗黙的にマップされます。これが機能するには、ソース スキーマとターゲット スキーマが一致している必要があります。そうでない場合は、InvalidOperationException がスローされます。

私が見る限り、あなたの Excel ファイルとデータベース テーブルはすべての列で一致していませ(自動インクリメントなど)。だから私はあなたの列マッピングを指定しようとします。

于 2013-02-03T04:21:20.873 に答える