【问题标题】:How to prevent OleDbDataReader.ExecuteReader from auto-appending integers to duplicate column values如何防止 OleDbDataReader.ExecuteReader 自动附加整数以复制列值
【发布时间】:2011-08-30 19:18:39
【问题描述】:

我正在尝试从 Excel (xls) 电子表格中导入数据。如果标题行中出现重复值,我需要抛出错误。我正在使用 OleDbDataReader 来摄取工作表数据。我遇到的问题是 .Net 将一个唯一整数附加到重复列的末尾,以便所有值都是唯一的。

标头值在运行时将是未知的。如果发现重复的标头值,则应停止对文件的处理。

例如,具有以下标题的电子表格: 品牌、型号、年份、品牌 将显示为: 品牌、型号、年份、品牌1

这里有一些代码:

           string selectString = "Select * from $Sheet1";
           xlConnection = new OleDbConnection(connectionString);
           OleDbCommand cmd = new OleDbCommand(selectString, xlConnection); 
           OleDbDataReader reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                for (int fieldIndex = 0; fieldIndex < reader.FieldCount; fieldIndex++)
                {
                    string columnValue = reader.GetName(fieldIndex);
                }
            }

GetName 返回品牌、型号、年份、品牌1

有没有办法防止这种行为?

【问题讨论】:

    标签: c# .net oledb datareader


    【解决方案1】:

    考虑使用:

      string selectString = "Select Make, Model, Year from $Sheet1";
    

    代替:

      string selectString = "Select * from $Sheet1";
    

    【讨论】:

    • 非常接近我的答案。确保运行时不附加数字以防止重复的列名(这真的会搞砸)的最佳方法是使用 AS 关键字显式设置要在 SQL 中返回的列名。 +1。
    • 在运行时不会知道列名。我们使用的导入代码允许用户导入电子表格中最多包含 255 列的任何文件。
    • 如果有重复的列,您还想继续处理该文件吗?
    • 您可能希望遍历 DataReaders 字段以动态创建列列表(用于 SQL) - 您将有机会忽略(如果您选择)相似的列(即那些列名附加 1 到已经存在的列)。
    • Arun - 不,如果发现重复,则不应处理该文件
    【解决方案2】:

    我有同样的要求,也面临同样的挑战。

    我通过修改连接字符串设置 HDR=NO 解决了这个问题。然后选择第一行并遍历每列中的值以检查唯一性。如果我找到匹配项,我会抛出 DuplicatNameException 以与 DataTable 保持一致。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2022-11-24
      • 1970-01-01
      • 2020-08-10
      • 2016-02-18
      • 1970-01-01
      • 2019-12-03
      • 2013-03-15
      • 1970-01-01
      • 2021-09-18
      相关资源
      最近更新 更多