Я написал процедуру для массовых записей импорта. Он не работает, и я думаю, что проблема в том, что у меня нет никакого ожидания, но я не знаю, как и где его вставить. Из-за характера моего проекта я не хочу, чтобы метод является асинхронным методом. Я просто использую async для уведомления об обновлениях.
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);
}
Буду признателен за любую помощь или ввод. Кроме того, комментарии к моему стилю кодирования или тому подобному приветствуются.
Вы правы, причина, по которой этот код не работает, заключается в том, что вы никогда не copy.WriteToServerAsync(csv);
вызова для copy.WriteToServerAsync(csv);
Метод возвращает вам объект Task
Я не хочу, чтобы метод был методом async. Я просто использую async для уведомления об обновлениях.
Получение уведомлений не зависит от использования async
версии метода. Фактически, собственный пример Microsoft для SqlRowsCopied
использует синхронную версию, то есть copy.WriteToServer(...)
.
Использование async
не помогло бы получать уведомления об пользовательских интерфейсах, если вы не будете полностью async
. См. Этот вопрос и ответы для получения дополнительной информации.