OracleDataReader reader.Read() 从第二个记录行开始读取行,跳过第一行记录

Posted

技术标签:

【中文标题】OracleDataReader reader.Read() 从第二个记录行开始读取行,跳过第一行记录【英文标题】:OracleDataReader reader.Read() starts to read rows from the second record row, skipping the first row record 【发布时间】:2021-07-21 20:34:10 【问题描述】:

我有一个 SQL 命令,它从数据库返回 8 行。

当我使用 reader.Read() 时,它从第二行开始,所以我松开了第一行结果。我不知道为什么它会跳过第一行记录。

command.CommandText = "SELECT ATTRIBUTE_DESCRIPTION, SUBSTR(ATTRIBUTE_DATATYPE, 2, 6) FROM " + proj.PID_Schema + "PIDD.ATTRIBUTES@" + proj.PID_Database + " WHERE " +
                "attribute_name LIKE 'Controller' " +
                "OR attribute_name LIKE 'Initials' " +
                "OR attribute_name LIKE 'IOType' " +
                "OR attribute_name LIKE 'NetworkType' " +
                "OR attribute_name LIKE 'SignalOutput' " +
                "OR attribute_name LIKE 'SignalInput' " +
                "OR attribute_name LIKE 'SPIInstrumentType' " +
                "OR attribute_name LIKE 'Substation' ORDER BY 1";

            try
            
                reader = command.ExecuteReader();
                reader.Read();

                if (reader.HasRows)
                
                    while (reader.Read())
                    
                        codelistsNumbersDict.Add(reader.GetValue(0).ToString(), reader.GetValue(1).ToString());
                    
                
            
            catch (Exception)
            
            

            connection.Close();

            return codelistsNumbersDict;
        

【问题讨论】:

使用适当的参数化,不要将数据连接到查询中。 请参阅***.com/questions/7505808/… 和bobby-tables.com。此外,您可以为查询使用逐字字符串@"SELECT...,然后您可以在字符串中使用换行符。此外,不要吞下带有空 catch 块的异常,并始终使用 using 块处理连接、命令和读取器 【参考方案1】:

你有两读吗:

reader = command.ExecuteReader();
reader.Read(); // <--- FIRST READ (skipe first row)

if (reader.HasRows)

    while (reader.Read())  // <---- SECOND READ
    

因此,您从第二行开始阅读。

如果您查看Retrieve data using a DataReader 示例,它只有一个内容:

SqlDataReader reader = command.ExecuteReader();
                   // <-- No read here on sample!
if (reader.HasRows)

    while (reader.Read()) // <-- Just ONE READ
    

【讨论】:

【参考方案2】:

正如@dani-herrera 的回答中所提到的,您拨打了两次reader.Read()

另外,您不需要if (reader.HasRows),因为如果没有行,do 循环内的代码将不会执行。如果您需要知道处理的行数,您可以随时添加计数器。

            try
            
                reader = command.ExecuteReader();

                while (reader.Read())
                
                    codelistsNumbersDict.Add(reader.GetValue(0).ToString(), reader.GetValue(1).ToString());
                
            

【讨论】:

以上是关于OracleDataReader reader.Read() 从第二个记录行开始读取行,跳过第一行记录的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中将 OracleDataReader 导出到 Excel

如何使用 OracleDataReader 检索给定记录的所有字段?

C# Oracle OracleDataReader.Read()

OracleDataReader reader.Read() 从第二个记录行开始读取行,跳过第一行记录

Function1 和 Reader Monad 的关系

react 预览pdf 转换