L'inserimento di massa SQL non inserisce correttamente i valori nella tabella

.net excel sqlbulkcopy sql-server-2008-r2

Domanda

Ho un file Excel (.xlsx) e sto cercando di caricare il contenuto del file in una tabella server Sql. Iam utilizza la copia bulk di SQL per inserire in blocco i dati. I dati vengono inseriti nella tabella ma trovo che i dati non siano inseriti correttamente.

Ecco i dati Excel di esempio-

inserisci la descrizione dell'immagine qui

Questo è il codice per la copia bulk di 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();
}

Dati dopo l'inserimento:

inserisci la descrizione dell'immagine qui

Viene inserita solo l'ultima riga e manca il valore della prima colonna nel foglio Excel. La colonna xid nella tabella è una colonna di incremento automatico.

Questa procedura è stata facile in MySql con "caricamento dati in infile", ma ho appena effettuato la migrazione al server Sql. Cosa sto sbagliando nel mio codice. Suggerimenti per favore

Risposta accettata

Sono un po 'sorpreso che tu non stia riportando un'eccezione.

In ogni caso, sospetto che (almeno in parte) il tuo problema sia che devi specificare i mapping delle colonne.

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

Se i mapping non sono definiti, ovvero la raccolta ColumnMappings è vuota, le colonne vengono mappate implicitamente in base alla posizione ordinale. Perché ciò funzioni, gli schemi di origine e di destinazione devono corrispondere. In caso contrario, verrà generata una InvalidOperationException.

Da quello che posso vedere il tuo file Excel e le tue tabelle del database non corrispondono su tutte le colonne (es. L'auto-incremento). Quindi proverei a specificare i mapping delle colonne .


Risposta popolare

Come follow-up del mio precedente commento, dato che manchi solo la prima riga, sembra che tu debba aggiungere HDR=No alla tua stringa di connessione.

Dovrebbe assomigliare a qualcosa di simile a questo:

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

--MODIFICARE

Si prega di notare gli apostrofi aggiunti.

In bocca al lupo.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow