0

尝试使用 asp.net 上传文件工具将 .csv 上传到我的 sql 服务器时出现错误。应用程序位于本地主机上,而 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 有关。是否可以将文件路由到与应用程序不同的服务器上保存和执行。如果那有意义的话。

4

2 回答 2

2

如果您使用批量加载的 TSQL 形式,则该代码在 SQL server 上执行,因此您指定的文件路径是相对于 DB server 的

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

于 2012-08-01T20:27:09.087 回答
0

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

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

我已经设法通过以下方式解决这个问题:

  • 将文件批量插入运行 SQL 服务器的实际机器上
  • 使用两台机器都可以访问的网络共享。不过,这在带宽方面可能会很昂贵。
于 2012-08-01T20:27:59.503 回答