BulkCopy.WriteToServerAsync() 无法导入记录
BulkCopy.WriteToServerAsync() Not Working Importing Records
我写了一个批量导入记录的例程。它不起作用,我认为问题是我在这里没有任何等待,但我不知道如何或在哪里放置它。由于我项目的性质,我不想要方法是一个异步方法。我只是使用异步通知更新。
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);
方法returns你是一个Task
对象
I don't want the method to be an async method. I am just using async to notify of updates.
获取通知不以使用 async
版本的方法为条件。事实上,微软自己的 example for SqlRowsCopied
使用的是同步版本,即 copy.WriteToServer(...)
.
使用 async
无助于获得 UI 通知,除非您一直使用 async
。 See this Q&A 获取更多信息。
我写了一个批量导入记录的例程。它不起作用,我认为问题是我在这里没有任何等待,但我不知道如何或在哪里放置它。由于我项目的性质,我不想要方法是一个异步方法。我只是使用异步通知更新。
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);
方法returns你是一个Task
对象
I don't want the method to be an async method. I am just using async to notify of updates.
获取通知不以使用 async
版本的方法为条件。事实上,微软自己的 example for SqlRowsCopied
使用的是同步版本,即 copy.WriteToServer(...)
.
使用 async
无助于获得 UI 通知,除非您一直使用 async
。 See this Q&A 获取更多信息。