sql大容量复制不会使用文件流将数据上传到数据库

本文关键字:数据 数据库 文件 复制 大容量 sql | 更新日期: 2023-09-27 18:25:33

我通过文件上传控件上传一个文件,然后流读取器读取文件itno-a-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();
        }
    }

sql大容量复制不会使用文件流将数据上传到数据库

简化您的代码;有很多方法可以将csv文件读入数据表中——例如,请参阅如何将csv文件读取到.NET数据表中。在上面的例子中,在完成读取流之后,似乎不会关闭它…在返回之前添加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; 
    } 

这样可以防止文件被锁定。

接下来要看的是检查数据表中是否真的有数据;您正在向数据表中添加行,但尚未定义列结构(即,您只提供了名称而没有提供数据类型,因此可能会出现转换问题)。使用其他方法加载文件肯定会更容易:-)