BulkCopy.WriteToServerAsync () non funziona Importazione di record

asynchronous c# sqlbulkcopy

Domanda

Ho scritto una routine per importare i record di massa. Non funziona e penso che il problema è che non ho alcun tipo di attesa qui, ma non so come o dove metterlo. A causa della natura del mio progetto, non voglio metodo per essere un metodo asincrono. Sto solo usando async per notificare degli aggiornamenti.

    public int LoadTempFile(string fn, string tableName)
    {
        int retVal = 1;
        // loads a CSV file into a temporary file of the same structure
        StatusWindow sw = new StatusWindow("Loading Temp Files");
        sw.Show();

        try
        {
            string cs = GetConnectionString() + ";Asynchronous Processing=true;"; 
            SqlConnection cxs = new SqlConnection(cs);
            SqlCommand cmd = new SqlCommand("Truncate table " + tableName, cxs);
            cxs.Open();
            cmd.ExecuteNonQuery();
            cmd.CommandTimeout = 640;
            cxs.Close();

            using (SqlBulkCopy copy = new SqlBulkCopy(cs))
            {
                using (StreamReader file = new StreamReader(fn))
                {
                    CsvReader csv = new CsvReader(file, true);
                    copy.DestinationTableName = tableName;
                    copy.BulkCopyTimeout = 1640;
                    copy.NotifyAfter = 100;
                    copy.SqlRowsCopied += (sender, eventArgs) =>
                     {
                        sw.Update(eventArgs.RowsCopied.ToString() + " Records Copied");
                    };


                    try
                    {
                       copy.WriteToServerAsync(csv);
                    }
                    catch (SqlException ex)
                    {
                        MessageBox.Show("SQL Error Importing " + fn + Environment.NewLine + ex.Message);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Error Importing " + fn + Environment.NewLine + ex.Message);
                    }

                }
            }
        }
        catch (Exception e)
        {
            MessageBox.Show("Error In Temp Files " + fn + Environment.NewLine + e.ToString());
            retVal = 0;
        }
        finally
        { sw.Close(); }
        return (retVal);
    }

Apprezzerei qualsiasi aiuto o input. Inoltre, anche i commenti sul mio stile di codifica o cose simili sono ben accetti.

Risposta accettata

Sei corretto, la ragione per cui questo codice non funziona è che non ti copy.WriteToServerAsync(csv); mai la chiamata a copy.WriteToServerAsync(csv); Il metodo ti restituisce un oggetto Task

Non voglio che il metodo sia un metodo asincrono. Sto solo usando async per notificare degli aggiornamenti.

Ottenere le notifiche non è condizionata dall'utilizzo della versione async del metodo. In effetti, l' esempio di Microsoft per SqlRowsCopied utilizza una versione sincrona, ovvero copy.WriteToServer(...) .

L'utilizzo di async non aiuta a ottenere le notifiche dell'interfaccia utente a meno che non si async l' async fino in fondo. Vedi questo Q & A per maggiori informazioni.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché