尝试使用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有关。是否可以将文件路由到与应用程序不同的服务器上保存和执行。如果这是有道理的。
答案 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
。
我已成功解决了这个问题: