如何防止 OleDbDataReader.ExecuteReader 自动附加整数以复制列值

Posted

技术标签:

【中文标题】如何防止 OleDbDataReader.ExecuteReader 自动附加整数以复制列值【英文标题】:How to prevent OleDbDataReader.ExecuteReader from auto-appending integers to duplicate column values 【发布时间】: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

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

【问题讨论】:

【参考方案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 保持一致。

希望这会有所帮助。

【讨论】:

以上是关于如何防止 OleDbDataReader.ExecuteReader 自动附加整数以复制列值的主要内容,如果未能解决你的问题,请参考以下文章

如何防止超卖

在winform当中提交数据,如何防止重复提交?

PostgreSQL如何防止表太大?

如何彻底防止SQL注入?

如何防止VBS的错误提示

https如何防止会话劫持