我通过文件上传控件上传文件,然后流阅读器将文件读取为数据表,然后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();
}
}
答案 0 :(得分:0)
简化您的代码;有很多方法可以将csv放入数据表中 - 例如,请参阅How to read a CSV file into a .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;
}
这可以防止文件被锁定。
接下来要看的是检查数据表中是否确实包含任何数据。设置一个断点并测试你的加载代码是否真的有效;您正在向数据表中添加行,但尚未定义列结构(即,您只提供了名称而不是数据类型,因此可能会出现转换问题)。使用其他方法加载文件肯定会更容易: - )