#c# #sql-server #visual-studio #excel
#c# #sql-сервер #visual-studio #excel
Вопрос:
Я пытаюсь импортировать файл .csv в свою базу данных. Я могу импортировать лист Excel в свою базу данных, однако из-за другого формата файла, такого как .csv, а также из .xls, мне нужно создать функцию импорта специально для .csv.
Ниже приведен мой код:
protected void Button1_Click(object sender, EventArgs e)
{
if (FileUpload1.HasFile)
{
// Get the name of the Excel spreadsheet to upload.
string strFileName = Server.HtmlEncode(FileUpload1.FileName);
// Get the extension of the Excel spreadsheet.
string strExtension = Path.GetExtension(strFileName);
// Validate the file extension.
if (strExtension != ".xls" amp;amp; strExtension != ".xlsx" amp;amp; strExtension != ".csv" amp;amp; strExtension != ".csv")
{
Response.Write("<script>alert('Failed to import DEM Conflicting Role Datasheet. Cause: Invalid Excel file.');</script>");
return;
}
// Generate the file name to save.
string strUploadFileName = @"C:Documents and SettingsrhlimMy DocumentsVisual Studio 2005WebSitesSoDUploadFiles" DateTime.Now.ToString("yyyyMMddHHmmss") strExtension;
// Save the Excel spreadsheet on server.
FileUpload1.SaveAs(strUploadFileName);
// Create Connection to Excel Workbook
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" strUploadFileName ";Extended Properties=Text;";
using (OleDbConnection ExcelConnection = new OleDbConnection(connStr)){
OleDbCommand ExcelCommand = new OleDbCommand("SELECT [columns] FROM userrolelist", ExcelConnection);
OleDbDataAdapter ExcelAdapter = new OleDbDataAdapter(ExcelCommand);
ExcelConnection.Open();
using (DbDataReader dr = ExcelCommand.ExecuteReader())
{
// SQL Server Connection String
string sqlConnectionString = "Data Source=<IP>;Initial Catalog=<DB>;User ID=<userid>;Password=<password>";
// Bulk Copy to SQL Server
using (SqlBulkCopy bulkCopy =
new SqlBulkCopy(sqlConnectionString))
{
bulkCopy.DestinationTableName = "DEMUserRoles";
bulkCopy.WriteToServer(dr);
Response.Write("<script>alert('DEM User Data imported');</script>");
}
}
}
}
else Response.Write("<script>alert('Failed to import DEM User Roles Data. Cause: No file found.');</script>");
}
Файл был успешно сохранен, но в ошибке указано, что путь к файлу неверен, хотя файл был успешно сохранен как .csv, поэтому я не могу продолжить процесс импорта данных в мою базу данных.
Ниже приведены скриншоты моей ошибки:
В заключение у меня возникает ошибка, заключающаяся в том, что путь к файлу, по которому сохраняется файл csv, неверен, хотя файл csv успешно сохранен. Нужна помощь опытного пользователя. Спасибо
Комментарии:
1. Почему бы не добавить
if(Path.Exists(fileName)) ...
для проверки также, это может быть проблема с ExcelConnection (возможно, с разрешениями)
Ответ №1:
Если вы читаете CSV-файл, в строке подключения должен быть указан каталог, содержащий ваш CSV-файл.
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
Path.GetDirectoryName(strUploadFileName);
Затем вы используете имя файла в своем операторе SELECT:
"SELECT * FROM [" Path.GetFileName(strUploadFileName) "]"
Комментарии:
1. 1 Добавление
Extended Properties="Text"";
не повредит, но да, это каталог, а не имя файла. Также обязательная ссылка на connectionstrings.com или в кб MSDN КАК: Использовать Jet OLE DB Provider 4.0 для подключения к базам данных ISAM не повредит
Ответ №2:
Я думаю, у вас возникла эта проблема, потому что вы используете «/» вместо «», пытаясь изменить путь C: …..
Ответ №3:
Вам нужно использовать обратные косые черты (
) в пути к файлу.
string strUploadFileName = @"C:Documents and SettingsrhlimMy DocumentsVisual Studio 2005WebSitesSoDUploadFiles" DateTime.Now.ToString("yyyyMMddHHmmss") strExtension;
ПРАВКА 1: я полагаю, FileUpload1.SaveAs
что он преобразует /
в
внутренне, чтобы определить правильное местоположение.
ПРАВКА 2: проблема с вашим connectionstring
, даже если вы используете .csv
формат, вам нужно установить Excel 8.0
или Excel 12.0 Xml
в качестве расширенных свойств
Вот пример:
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" strUploadFileName ";Extended Properties=Excel 12.0 Xml;";
Для других типов проверьте код раздела OLEDB моей статьи.
Комментарии:
1. Нет, если я изменю на , это выдаст мне ошибку. Этот путь к файлу работает, когда я загружаю файлы .xls, но эта ошибка появляется только тогда, когда я изменяю свой код для обслуживания файлов .csv.
2.
OleDbConnection
не принимает косые черты (/
). Следовательно, здесь нужно упомянуть обратную косую черту.3. если я использую обратную косую черту, в нем указывается нераспознанная управляющая последовательность
4. укажите,
@
прежде"C:
чем это приведет к удалению значения escape()
или просто используйте(\)
. Внимательно смотрите на мой ответ….5. вам нужно поместить () обратную косую чертуbackslash
Ответ №4:
Чтобы избежать открытия соединения, вы можете использовать, например
// Read the CSV file name amp; file path
// I am usisg here Kendo UI Uploader
string path = "";
string filenamee = "";
if (files != null)
{
foreach (var file in files)
{
var fileName = Path.GetFileName(file.FileName);
path = Path.GetFullPath(file.FileName);
filenamee = fileName;
}
// Read the CSV file data
StreamReader sr = new StreamReader(path);
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);
}
}
Для получения дополнительной справки вы также можете посмотреть эту ссылку