【问题标题】:Single DBDataRecord From DataReader来自 DataReader 的单个 DBDataRecord
【发布时间】:2014-01-08 16:22:32
【问题描述】:

我正在使用以下通用数据帮助函数来运行查询并将它们作为 DbDataRecords 的集合返回。

public static IEnumerable<DbDataRecord> GetDataRecords(string Query, Dictionary<string, object> Parameters, CommandType CommandType = CommandType.Text)
    {
        using (MySqlConnection Connection = CreateConnection())
        {   
            using (MySqlCommand cmd = new MySqlCommand(Query, Connection))
            {
                cmd.CommandType = CommandType;

                foreach (var Parameter in Parameters)
                {
                    cmd.Parameters.AddWithValue(Parameter.Key, Parameter.Value);
                }

                Connection.Open();     
                using (MySqlDataReader Reader = cmd.ExecuteReader())
                {
                    foreach (DbDataRecord record in Reader)
                    {
                        yield return record;
                    }          
                }                    
                Connection.Close();  
            }
        } 
    }

这适用于多个结果,但我还想创建一个函数,将来自阅读器的单个记录作为单个 DbDataRecord 返回。我想不通的是如何将读取器中的单行转换为 DbDataRecord。这是我目前所拥有的:

 public static DbDataRecord GetDataRecord(string Query, Dictionary<string, object> Parameters, CommandType CommandType = CommandType.Text)
    {
        DbDataRecord Record = null;

        using (MySqlConnection Connection = CreateConnection())
        {
            using (MySqlCommand cmd = new MySqlCommand(Query, Connection))
            {
                cmd.CommandType = CommandType;

                foreach (var Parameter in Parameters)
                {
                    cmd.Parameters.AddWithValue(Parameter.Key, Parameter.Value);
                }

                Connection.Open();
                using (MySqlDataReader Reader = cmd.ExecuteReader())
                {
                   if(Reader.Read() != false)                        
                   {
                       Record = ???;
                   }                        
                }
                Connection.Close();
            }
        }

        return Record;
    }

我已经看到很多示例显示如何返回一列(ExecuteScalar),这不是我想要的。我也知道如何获取单个列值。同样,这不是我想要做的。

基本上我想替换下面的foreach循环

foreach (DbDataRecord record in Reader)
{
    yield return record;
}  

具有将单个读取器行转换为 DBDataRecord 的东西

【问题讨论】:

    标签: c# datareader


    【解决方案1】:

    您可以改为返回IDataRecord,这样就足够了,然后您可以直接返回MySqlDataReader。或者你必须相应地转换它:

    所以这是不可能直接的:

    Record = (DbDataRecord)Reader;
    

    但是以这种方式:

    Record = (DbDataRecord)(IDataRecord)Reader;
    

    【讨论】:

    • 我最终使用了您的建议来返回 IDataRecord 而不是 DbDataRecord。我遇到的一个问题是我必须从 MySqlConnection Connection = CreateConnection() 和 MySqlDataReader Reader = cmd.ExecuteReader() 中删除 using 语句。我知道一旦我退出 using 语句,阅读器就会被破坏,但由于我已将阅读器的输出分配给 IDataRecord,我认为这会使它保持活动状态。我返回 IDataRecord 或 DBDataRecord 的全部目的是因为它们在连接关闭后仍然存在。
    • @LouiseEggleton:我建议创建一个自定义类,在方法中创建一个实例并返回它。这更有意义和可维护(但也需要更多工作)。如果你需要一个通用的内存对象,你可以返回一个DataRow。但是,我总是会尽快关闭/处置DataReader/Command/Connection,最好使用using-statement。
    • 蒂姆,我打算把它放在一个类以及其他一些数据库方法中。在这一点上,我只是想让我的通用 Query 方法工作,所以我还没有走那么远。我正在使用 Reader = cmd.ExecuteReader(CommandBehavior.CloseConnection) 关闭连接,但我仍然不明白为什么如果我将 Reader 输出分配给 IDataRecord 变量,为什么退出 using 语句时会破坏 IDataRecord 变量。
    • @LouiseEggleton:因为通过return 离开该方法,您将离开调用reader.Disposeusing-statement(IDataRecord 仍然是刚刚投射的读者)。这是有道理的,因为DataReader 不是内存中的对象,而是需要打开的数据库连接来检索记录和字段的对象。请注意,DataReader 不是所有已加载的DataTable,它是到数据库的无缓冲流。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    相关资源
    最近更新 更多