【问题标题】:Loading CSV file in C# Winform get's older version在 C# Winform 获取旧版本中加载 CSV 文件
【发布时间】:2019-11-26 14:17:31
【问题描述】:

我得到的程序能够将 CSV 和 Excel 文件加载到数据网格视图中。 除了 CSV 文件保留旧数据外,这工作得很好。

例如,CSV 文件有 30 个值。我将数据加载到datagridview中,它工作正常。 我关闭应用程序,然后编辑删除 26 行的 CSV 文件。下次我打开应用程序并加载文件时,即使该文件不再存在,它仍然会得到具有 30 个值的版本。

为了清楚起见,我在记事本中打开并编辑文件,它按预期工作,但即使在记事本中编辑后,我的 Winform 应用程序似乎也加载了以前的版本。即使我重命名文件,它仍然需要不再存在的数据。即使在完全重新启动 PC 后,该文件仍会保留不应该存在的数据。 但是!如果我将文件移动到不同的文件夹(添加新文件夹并将其放入其中),它会加载新数据...

编辑: 似乎它实际上正在加载文件夹中的所有 CSV 文件。 (包括旧版本)

什么可能导致这个问题?看到 Excel 文件没有遇到这个问题。

使用的代码:

    private void OpenExcel()
    {
        OpenFileDialog openFileDialog1 = new OpenFileDialog
        {
            InitialDirectory = @"C:\",
            Title = "Browse Text Files",

            CheckFileExists = true,
            CheckPathExists = true,

            DefaultExt = "txt",
            FilterIndex = 2,
            RestoreDirectory = true,

            ReadOnlyChecked = true,
            ShowReadOnly = true,
            Filter = "Excel Worksheets|*.csv"
        };

        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            FileLocation  = openFileDialog1.FileName;                
            GetExcelSheetNames(openFileDialog1.FileName);

            MyConnection = new OleDbConnection(connString);

            MyCommand = new OleDbDataAdapter("select * from [" + SheetName + "]", MyConnection);
            MyCommand.TableMappings.Add("Table", "TestTable");
            Datatable_Temp = new DataTable();
            MyCommand.Fill(Datatable_Temp);
            MyConnection.Close();              
        }
        else
        {
            Canceled = true;
        }            
    }

    private string GetExcelSheetNames(string excelFile)
    {
        OleDbConnection objConn = null;
        DataTable dt = null;
        string CSVOrNot = excelFile.Substring(excelFile.Length - 3);    

        try
        {
            // Connection String.
            if (CSVOrNot == "csv")
            {
                connString = string.Format(@"Provider=Microsoft.Jet.OleDb.4.0; Data Source={0};Extended Properties=""Text;HDR=YES;FMT=Delimited""", Path.GetDirectoryName(excelFile));
            }
            else
            {
                connString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + excelFile + ";Extended Properties=Excel 12.0;";
            }
            // Create connection object by using the preceding connection string.
            objConn = new OleDbConnection(connString);
            // Open connection with the database.
            objConn.Open();
            // Get the data table containg the schema guid.
            dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

            if (dt == null)
            {
                MessageBox.Show("No Data Found");
                return null;
            }
            SheetName = dt.Rows[0]["TABLE_NAME"].ToString();

            return SheetName;
        }
        catch
        {
            return null;
        }
        finally
        {
            // Clean up.
            if (objConn != null)
            {
                objConn.Close();
                objConn.Dispose();
            }
            if (dt != null)
            {
                dt.Dispose();
            }
        }
    }

【问题讨论】:

  • 您对 CSV 文件的更改真的得到保存了吗?您确定要加载更改后的文件吗?
  • 确保应用程序没有保存 xlsx 而不是 csv。保存在哪里?您正在使用 oledb,并且必须使用 Update 或 Insert 写回数据。
  • @MarkusDeibel 我确实使用记事本将其保存为 CSV 文件。如果我在记事本或 Excel 中打开文件,该文件已经完成了它应该做的事情,但由于某种原因,我的 Winforms 继续加载不再存在的文件。就像它在某种缓存中一样。
  • “显示的代码是所用代码的全部”——当然不是。至少,它缺少程序中使用的各种变量的声明。它需要外部设置,例如 CSV 文件本身,当然还有 Excel 安装。如果没有 Excel 就无法重现这一点,那么这实际上更像是一个 Excel 用户问题,而不是一个编程问题。
  • @A.bakker:忽略发布完整代码的请求并不方便我们为您提供帮助。

标签: c# winforms csv


【解决方案1】:

我发现了问题,这与我想的不同。 看到文件的旧版本也在文件夹中,我没有注意到它没有采用旧版本,但它只是将所有 CSV 文件合并到输出中。

我搜索了这个并找到了以下帖子: c# reading csv file gives not a valid path

我添加了一个 if 子句来查看文件是否为 csv 文件,然后使用以下内容: 因为打开 Excel 或 CSV 文件之间的区别在于 Excel 文件要求提供路径和文件名,而 CSV 只需要路径,然后在查询中选择文件......有点奇怪但没关系。

MyCommand = new OleDbDataAdapter("SELECT * FROM [" + Path.GetFileName(openFileDialog1.FileName) + "]", MyConnection);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多