C # VS2005 импортирует CSV-файл в базу данных SQL

#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);  
       }  
     }  
  

Для получения дополнительной справки вы также можете посмотреть эту ссылку