C# OLEDB-соединение для EXCEL не работает в цикле - PullRequest
0 голосов
/ 10 июля 2020

1-У меня странная проблема.

Требование: прочтите список файлов Excel в папке и сохраните содержимое в наборе данных.

Что я написал: Нажатие кнопки:

protected void btnUploadExcelFiles_Click(object sender, EventArgs e)
{
            string[] strFiles = Directory.GetFiles(strPath);
            foreach (string strFile in strFiles)
            {
                ClsExcelUpload objExcelUpload = new ClsExcelUpload();
                string szConnectionString1 = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + strFile + "';Extended Properties=\"Excel 12.0;HDR=YES;\"";
                objExcelUpload.ReadExcel(szConnectionString1, strFile);

            }
}

функция ReadExcel:

public string ReadExcel(string szConnectionString, string strFile)
    {
        OleDbConnection objConn = new OleDbConnection();
        objConn.ConnectionString = szConnectionString;
        objConn.Open();

        OleDbDataAdapter DAobjBasicInfo = new OleDbDataAdapter();
        DAobjBasicInfo = new OleDbDataAdapter("select * from [Sheet1$]", objConn);
        DataTable dt1 = new DataTable();
        DAobjBasicInfo.Fill(dt1);
        objConn.Close();
        objConn.Dispose();
        return "";
    }

Проблема: szConnectionString обновляется с новым именем файла устанавливается через l oop, но когда OleDbDataAdapter открывает objConn, он ищет файл Excel, который уже удален. и datatable каждый раз получает данные первого файла каждый раз.

весь код:

с использованием System.Data;

с использованием System.Data.OleDb;

    protected void btnUploadExcelFiles_Click(object sender, EventArgs e)
    {
        HttpFileCollection files = Request.Files;
        for (int i = 0; i < files.Count; i++)
        {
            HttpPostedFile file = files[i];
            if (file.ContentLength > 0)
            {
                FileUploadExcel.SaveAs(Server.MapPath(@"~\UploadedFile\") + file.FileName);

            }
        }
    string strPath = Path.GetFullPath(Server.MapPath(@"~\UploadedFile\"));
    string[] strFiles = Directory.GetFiles(strPath);
    foreach (string strFile in strFiles)
    {
        ClsExcelUpload objExcelUpload = new ClsExcelUpload();
        string szConnectionString1 = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + strFile + "';Extended Properties=\"Excel 12.0;HDR=YES;\"";
      string result=  ReadExcel(szConnectionString1, strFile);

    }
}


    public string ReadExcel(string szConnectionString, string strFile)
    {
        OleDbConnection objConn = new OleDbConnection();
        objConn.ConnectionString = szConnectionString;
        objConn.Open();

        OleDbDataAdapter DAobjBasicInfo = new OleDbDataAdapter();
        DAobjBasicInfo = new OleDbDataAdapter("select * from [Sheet1$]", objConn);
        DataTable dt1 = new DataTable();
        DAobjBasicInfo.Fill(dt1);
        objConn.Close();
        objConn.Dispose();
        File.Delete(strFile);
        return "";
    }

Дальнейший анализ этого странного вопроса: Я бы попытался объяснить более подробно. У меня есть один элемент управления FileUpload, который позволяет выбирать и загружать несколько файлов. командная кнопка, которая копирует отправленный файл через FileUpload в указанное место. Здесь все работает как положено. Теперь у меня есть код, написанный на той же командной кнопке, чтобы прочитать скопированный файл Excel. Первый файл читается правильно. при чтении второго файла он находит те же данные.

Теперь, чтобы проверить это дальше. Я переместил код чтения файла на другую командную кнопку. Сейчас сделал 2 теста. Тест 1. Загрузите 2 файла с помощью загрузки файла. Нажмите кнопку 1, чтобы скопировать отправленные файлы в указанное место, нажмите кнопку 2, чтобы просмотреть файлы в скопированной папке и прочитать файлы. Результат: та же проблема, при чтении второго файла получаются те же данные. Тест 2: Запустите приложение. Не выбирайте и не загружайте файлы. Вручную скопируйте то же самое в файлы в указанное место. щелкните командную кнопку 2, чтобы прочитать файлы. Файл читается правильно.

Совершенно ясно, что с функцией чтения файлов все в порядке. Когда загрузка файлов работает, в управлении памятью должен быть конфликт. Интересно, какая у меня альтернатива этому требованию.

1 Ответ

0 голосов
/ 11 июля 2020

Проблема решена. Нет ничего плохого в чтении Excel. Проблема заключается в сохранении опубликованного файла в указанном месте.

protected void btnUploadExcelFiles_Click(object sender, EventArgs e)
{
    HttpFileCollection files = Request.Files;
    for (int i = 0; i < files.Count; i++)
    {
        HttpPostedFile file = files[i];
        if (file.ContentLength > 0)
        {
            FileUploadExcel.SaveAs(Server.MapPath(@"~\UploadedFile\") + file.FileName);

        }
    }
string strPath = Path.GetFullPath(Server.MapPath(@"~\UploadedFile\"));
string[] strFiles = Directory.GetFiles(strPath);
foreach (string strFile in strFiles)
{
    ClsExcelUpload objExcelUpload = new ClsExcelUpload();
    string szConnectionString1 = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + strFile + "';Extended Properties=\"Excel 12.0;HDR=YES;\"";
  string result=  ReadExcel(szConnectionString1, strFile);

}

}

        }
    }

он читал и копировал один и тот же файл с другим именем. Поэтому при чтении из указанного места он был чтение одних и тех же данных из разных файлов.

исправленная функция выглядит следующим образом

        protected void btnUploadExcelFiles_Click(object sender, EventArgs e)
    {
        List<string> LstStrPriExcelUploadError = new List<string>();
        HttpFileCollection files = Request.Files;
        foreach (HttpPostedFile uploadedFile in FileUploadExcel.PostedFiles)
        {
            string fn = System.IO.Path.GetFileName(uploadedFile.FileName);
            string SaveLocation = Server.MapPath(@"~\UploadedFile\") + "\\" + fn;

            uploadedFile.SaveAs(SaveLocation);
        }
    }
...