0
我通過文件上傳控件上傳文件,然後流讀取器讀取文件itno數據表,然後sql批量複製將數據表複製到我的sql數據庫並填充適當的專欄。有沒有人看到下面的代碼有什麼問題?我沒有收到錯誤消息,但似乎它掛在IIS進程上。我不能去從文件夾中刪除csv文件,因爲它說該過程仍在工作。sql批量複製不會將數據上傳到使用文件流的數據庫
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();
}
}
您可以使用SqlDataReader而不是DataTable ..? – MethodMan 2012-02-23 21:53:01
SQL批量複製應該可以正常工作,但我從來沒有在網頁中使用它,只能在Windows服務中使用它。你能給我們一個關於文件大小的想法嗎?它看起來基本上是將整個文件一次性推送到服務器。你在做這件事情時是否檢查過服務器的內存利用率?這基本上是在將整個文件加載到數據表中時將整個文件存儲在內存中,以便在文件很大的情況下降低服務器的性能。 – swannee 2012-02-23 22:03:57
它應該可以正常工作;該文件被上傳到服務器,然後SqlBulkCopy從本地服務器文件系統到數據庫 - 如果文件實際上傳了,當然(在這種情況下,因爲文件被鎖定在服務器端;-) – dash 2012-02-23 22:10:19