无法执行批量加载

时间:2012-08-01 20:18:47

标签: c# asp.net sql bulk-load

尝试使用asp.net uploadfile工具将.csv上传到我的sql server时出错。应用程序位于localhost上,SQL Server不在同一台计算机上。它使用适当的列在数据库内创建表,只是不填充数据。这是代码错误:“无法批量加载,因为文件”c:\ users \ visual studio 2010 \ Projects \ webImport \ webImport \ UploadedCSVFiles \ Employee.csv“无法打开。操作系统错误代码3(系统找不到指定的路径。)。

这是背后的代码:

        private void LoadDataToDatabase(string tableName, string fileFullPath, string delimeter)
    {
        string sqlQuery = string.Empty;
        StringBuilder sb = new StringBuilder();
        sb.AppendFormat(string.Format("BULK INSERT {0} ", tableName));
        sb.AppendFormat(string.Format(" FROM '{0}'", fileFullPath));
        sb.AppendFormat(string.Format(" WITH ( FIELDTERMINATOR = '{0}' , ROWTERMINATOR = '\n' )", delimeter));

        sqlQuery = sb.ToString();
        using (SqlConnection sqlConn = new SqlConnection(GetConnectionString()))
        {
            sqlConn.Open();
            SqlCommand sqlCmd = new SqlCommand(sqlQuery, sqlConn);
            sqlCmd.ExecuteNonQuery();
            sqlConn.Close();
        }
    }

    protected void BTNImport_Click1(object sender, EventArgs e)
    {
        if (FileUpload1.HasFile)
        {
            FileInfo fileInfo = new FileInfo(FileUpload1.PostedFile.FileName);
            if (fileInfo.Name.Contains(".csv"))
            {

                string fileName = fileInfo.Name.Replace(".csv", "").ToString();
                string csvFilePath = Server.MapPath("UploadedCSVFiles") + "\\" + fileInfo.Name;

                //Save the CSV file in the Server inside 'MyCSVFolder' 
                FileUpload1.SaveAs(csvFilePath);
                //Fetch the location of CSV file 
                string filePath = Server.MapPath("UploadedCSVFiles") + "\\";
                string strSql = "SELECT * FROM [" + fileInfo.Name + "]";
                string strCSVConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";" + "Extended Properties='text;HDR=YES;'";
                // load the data from CSV to DataTable 
                OleDbDataAdapter adapter = new OleDbDataAdapter(strSql, strCSVConnString);
                DataTable dtCSV = new DataTable();
                DataTable dtSchema = new DataTable();
                adapter.FillSchema(dtCSV, SchemaType.Mapped);
                adapter.Fill(dtCSV);

                if (dtCSV.Rows.Count > 0)
                {
                    CreateDatabaseTable(dtCSV, fileName);
                    Label2.Text = string.Format("The table ({0}) has been successfully created to the database.", fileName);

                    string fileFullPath = filePath + fileInfo.Name;
                    LoadDataToDatabase(fileName, fileFullPath, ",");
                    Label1.Text = string.Format("({0}) records has been loaded to the table {1}.", dtCSV.Rows.Count, fileName);
                }
                else
                {
                    Label3.Text = "File is empty.";
                }
            }
            else
            {
                Label3.Text = "Unable to recognize file.";
            }

        }
    }

我猜它与Server.MapPath有关。是否可以将文件路由到与应用程序不同的服务器上保存和执行。如果这是有道理的。

2 个答案:

答案 0 :(得分:2)

如果您使用TSQL形式的批量加载,该代码将在SQL Server 上执行,因此您指定的文件路径是相对于数据库服务器的

在您的情况下,我认为您应该从代码项目中查看SqlBulkCopy和“Fast CSV Reader”;他们一起工作很好。然后,您将在Web服务器上处理CSV,并通过非常有效的API将批量流发送到SQL服务器。

答案 1 :(得分:0)

BULK INSERT路径用于服务器的引用框架。如果我使用Management Studio或我的计算机上的其他应用程序将查询代码发送到运行实际SQL服务器的其他计算机,则服务器将获取我的查询并尝试从服务器的视图中解析路径。文件系统。

这意味着我的计算机可能在路径C:\folder\foo.txt上有一个文件。如果我连接到运行SQL Server的计算机并尝试BULK INSERT DBO.FOO from 'C:\folder\foo.txt',服务器将查看其自己的C:\分区以尝试找到foo.txt

我已成功解决了这个问题:

  • 将文件置于运行SQL Server的实际计算机上的批量插入
  • 使用网络共享,两台计算机都可以访问。不过,这可能是带宽昂贵的。