Excel SqlBulkCopy funziona in modo diverso sul PC locale e sul server delle applicazioni?

c# excel oledbconnection sqlbulkcopy

Domanda

La mia applicazione tronca una tabella di database e la riempie con le righe di un excel.

Usando un file excel (2000 righe), il codice di caricamento sotto inserisce tutte le righe nel database completamente nel mio pc locale (il mio ambiente di sviluppo) e lo ha fatto anche nel server, quindi ho pensato di aver completato il compito con successo

Ma poi un utente ha aggiunto 10 nuove righe al mio excel e ha provato a caricare le righe del 2010 ma tranne le 10 righe aggiunte di recente è stata inserita la riga 2000, quindi utilizzando quel file excel con le righe del 2010, se lo carico dalla tabella del database del server popolata con 2000 righe, e se lo carico usando la mia tabella finale del mio ambiente di lavoro sono le righe del 2010.

Il server e l'applicazione locale sono esattamente gli stessi. Ho provato anche la formattazione ecc

Modifica esempio di esecuzione: File MyRecords.xlsx si trova nel mio desktop, ora mi connetto alla mia applicazione usando

http://myserver/myapplication

e carica MyRecords.xlsx, quindi controlla il conteggio nel database, dice 2361 records, quindi apri Visual Studio e avvia la mia applicazione ( http://localhost:58029/ ) e carica MyRecords.xlsx e controlla nuovamente il database che dice 2362 record.

Modifica Esempio Esecuzione 2: Il mio excel ha 2160 linee, Se lo carico, inserisce 2160 linee sia dal locale che dal server. Se rimuovo 1000 mila righe e lo carico, ora inserisce 1160 linee dal locale e dal server come previsto. Ora Se aggiungo di nuovo queste 1000 righe e carica Excel, ora se ho fatto questo processo usando l'ambiente locale funziona bene 2160 righe inserite, Se server, 1160 righe inserite. Quindi nessuna modifica su Excel non è vista sul lato server, quindi sei sicuro che questa sia la ragione? â € “

    private void UploadData(string path, string dbTableName)
    {
        //Create connection string to Excel work book
        string excelConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;Persist Security Info=False";
        //Create Connection to Excel work book
        OleDbConnection excelConnection = new OleDbConnection(excelConnectionString);
        //Create OleDbCommand to fetch data from Excel

        excelConnection.Open();
        DataTable dbSchema = excelConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); //Get First Sheet Name
        OleDbCommand cmd = new OleDbCommand("Select * from [" + dbSchema.Rows[0]["TABLE_NAME"].ToString() + "]", excelConnection);

        OleDbDataReader dReader;
        dReader = cmd.ExecuteReader();
        SqlBulkCopy sqlBulk = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["MyDbConn"].ConnectionString);

        //Give your Destination table name
        sqlBulk.DestinationTableName = dbTableName;

        try
        {
            sqlBulk.WriteToServer(dReader);
            if(dbTableName == "TempTP")
            {
                SDatabaseManagerData.DatabaseManagerData.UpdateTP();
            }

            lbl_Error.Visible = true;
            lbl_Error.Text = "Database updated!";

        }
        catch (SqlException ex)
        {
            lbl_Error.Visible = true;
            lbl_Error.Text = "Database updated edilemedi! Hata: " + ex.Message;
        }

        excelConnection.Close();
    }

Risposta popolare

Questo accade a causa della funzionalità "typeguessrow" di Excel. Cambia registro imposta il typeguessrow da 8 a 0.

Processi
1.type regedit.exe al prompt dei comandi e cercare typeguessrow (premere F3 per aprire la ricerca).
2. esportare il registro come backup

Editor del Registro di sistema di Windows versione 5.00

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Office \ 12.0 \ Access Connectivity Engine \ Engines \ Excel]
"DisabledExtensions" = "! Xls"
"ImportMixedTypes" = "testo"
"FirstRowHasNames" = hex: 01
"AppendBlankRows" = dword: 00000001
"TypeGuessRows" = dword: 00000008
"Win32" = "C: \ PROGRA ~ 1 \ COMMON ~ 1 \ MICROS ~ 1 \ OFFICE12 \ ACEEXCL.DLL"

  1. cambia "TypeGuessRows" = dword: 00000008 in "TypeGuessRows" = dword: 00000000
  2. registro di importazione


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