SQLにレコードを挿入しようとしていますが、ExcelとSQlテーブルの間でカラムをマップしようとすると問題が発生します。マッピングを外した場合、挿入は機能しますが、データは間違ったフィールドに入ります。与えられたエラーは、データソースには指定された列が含まれていなくても含まれているということですか?なぜそれがExcelの列見出しを認識していないのかについての示唆。 enter image description hereC#SQLからExcelへのSQLの一括挿入ExcelとDataTableの間のカラムマッピング
protected void LoadFile(object sender, EventArgs e)
{
{
//Upload and save the file
string path = Server.MapPath("~/Files/") + Path.GetFileName(FileUpload1.PostedFile.FileName);
FileUpload1.SaveAs(path);
string conString = string.Empty;
string extension = Path.GetExtension(FileUpload1.PostedFile.FileName);
switch (extension)
{
case ".xls": //Excel 97-03
conString = ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + "; Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\"");
break;
case ".xlsx": //Excel 07 or higher
conString = ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source= "+ path +";Extended Properties ='Excel 12.0 Xml;HDR=YES;IMEX=1';");
break;
//conString = ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + "; Extended Properties='Excel 12.0;HDR=YES;IMEX=1;';");
}
conString = string.Format(conString, path);
using (OleDbConnection excel_con = new OleDbConnection(conString))
{
excel_con.Open();
string sheet1 = excel_con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null).Rows[0]["TABLE_NAME"].ToString();
OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();
DataSet ds = new DataSet();
DataTable dtExcelData = new DataTable();
OleDbConnection OleDbcon = new OleDbConnection(conString);
OleDbCommand cmd = new OleDbCommand("SELECT * FROM [" + sheet1 + "]", OleDbcon);
OleDbcon.Open();
cmd.Connection = OleDbcon;
objAdapter1 = new OleDbDataAdapter(cmd);
objAdapter1.Fill(ds);
dtExcelData = ds.Tables[0];
excel_con.Close();
using (SqlConnection con = new SqlConnection(ConString))
{
using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con))
{
//Set the database table name
sqlBulkCopy.DestinationTableName = "dbo.mytable";
//[OPTIONAL]: Map the Excel columns with that of the database table
sqlBulkCopy.ColumnMappings.Add("Tag","Tag");
sqlBulkCopy.ColumnMappings.Add("ExitDate","ExitDate");
sqlBulkCopy.ColumnMappings.Add("Exit","Exit");
sqlBulkCopy.ColumnMappings.Add("Amount","Amount");
con.Open();
sqlBulkCopy.WriteToServer(dtExcelData);
con.Close();
}
}
}
}`
すべてのヘルプは高く評価され、ありがとうございました!
デバッグ作業にどれだけの時間を費やしましたか?データを含むスプレッドシートを作成してこのコードを使用し、dtExcelDataをレビューするためにブレークポイントを設定すると、ColumnNamesをドリルダウンして、それぞれのように表示できます。このコードの内部でこれを行うことができることを確認できますか? – tjcertified
挿入しているテーブルのスキーマを指定できますか? – Ehz