Я загружаю файл через элемент управления загрузкой файлов, а затем поток чтения читает файл itno datatable, а затем объемный экземпляр sql копирует данные в мою базу данных sql и заполняет соответствующие столбцы. Кто-нибудь видит что-то неправильно с кодом ниже? Я не получаю сообщение об ошибке, но похоже, что он попадает на процесс IIS. Я не могу войти, чтобы удалить файл csv из папки, потому что он говорит, что процесс все еще работает.
protected void btnUpload_Click(object sender, EventArgs e)
{
//upload file to the gencouploadfiles folder
UploadFile();
//fetch CSV file from the folder
string strFilePath = Server.MapPath("GencoUploadFiles") + "\\" + "GencoUploadFile.txt";
//perform sql bulk copy
PerformBulkCopy(GencoUpload(strFilePath));
//delete the file from the folder
}
public void UploadFile()
{
if (fileUpload1.HasFile)
{
FileInfo fileinfo = new FileInfo(fileUpload1.PostedFile.FileName);
string strCsvFilePath = Server.MapPath("GencoUploadFiles") + "\\" + "GencoUploadFile.txt";
fileUpload1.SaveAs(strCsvFilePath);
}
}
public static DataTable GencoUpload(string filepath)
{
StreamReader sr = new StreamReader(filepath);
string line = sr.ReadLine();
string[] value = line.Split('|');
DataTable dt = new DataTable();
DataRow row;
foreach (string dc in value)
{
dt.Columns.Add(new DataColumn(dc));
}
while (!sr.EndOfStream)
{
value = sr.ReadLine().Split('|');
if (value.Length == dt.Columns.Count)
{
row = dt.NewRow();
row.ItemArray = value;
dt.Rows.Add(row);
}
}
return dt;
}
public void PerformBulkCopy(DataTable dt)
{
SqlConnection conStr = new SqlConnection(ConfigurationManager.ConnectionStrings["EDI"].ConnectionString);
using (SqlBulkCopy bulkcopy = new SqlBulkCopy(conStr.ConnectionString))
{
bulkcopy.DestinationTableName = "dbo.GencoUploadTempTable";
bulkcopy.BatchSize = dt.Rows.Count;
conStr.Open();
bulkcopy.WriteToServer(dt);
bulkcopy.Close();
conStr.Close();
}
}
Упростите код; существует множество способов получить csv в datatable - см. Как читать файл CSV в .NET Datatable, например. В приведенном выше примере вы, кажется, не закрываете поток после того, как вы его прочитали ... добавьте sr.Close () перед возвратом или еще лучше заверните объявление в инструкции using ():
public static DataTable GencoUpload(string filepath)
{
DataTable dt = new DataTable();
using(StreamReader sr = new StreamReader(filepath))
{
string line = sr.ReadLine();
string[] value = line.Split('|');
DataRow row;
foreach (string dc in value)
{
dt.Columns.Add(new DataColumn(dc));
}
while (!sr.EndOfStream)
{
value = sr.ReadLine().Split('|');
if (value.Length == dt.Columns.Count)
{
row = dt.NewRow();
row.ItemArray = value;
dt.Rows.Add(row);
}
}
}
return dt;
}
Это должно помешать блокировке файла.
Следующее, на что нужно обратить внимание, - проверить, действительно ли в таблице данных есть какие-либо данные. Поместите точку останова и проверьте, действительно ли ваш код загрузки работает; вы добавляете строки в таблицу данных, но вы не указали структуру столбцов (т.е. вы указали только имена, а не типы данных, чтобы вы могли получить проблемы с преобразованием). Определенно, будет проще использовать один из других методов для загрузки вашего файла :-)