C# 从类返回0行的mysql数据读取

C# 从类返回0行的mysql数据读取,c#,mysql,mysqldatareader,C#,Mysql,Mysqldatareader,我正在我的应用程序中实现一个数据库管理器类,主要是因为有3个数据库要连接到一个本地数据库 但是return函数不起作用,我知道查询会返回行,但当类返回时,它有0。我错过了什么 public MySqlDataReader localfetchrows(string query, List<MySqlParameter> dbparams = null) { using (var conn = connectLocal()) {

我正在我的应用程序中实现一个数据库管理器类,主要是因为有3个数据库要连接到一个本地数据库

但是return函数不起作用,我知道查询会返回行,但当类返回时,它有0。我错过了什么

public MySqlDataReader localfetchrows(string query, List<MySqlParameter> dbparams = null)
    {
        using (var conn = connectLocal())
        {
            Console.WriteLine("Connecting local : " + conn.ServerVersion);
            MySqlCommand sql = conn.CreateCommand();
            sql.CommandText = query;
            if (dbparams != null)
            {
                if (dbparams.Count > 0)
                {
                    sql.Parameters.AddRange(dbparams.ToArray());
                }
            }
            MySqlDataReader reader = sql.ExecuteReader();
            Console.WriteLine("Reading data : " + reader.HasRows + reader.FieldCount);
            return reader;
            /*
            using (MySqlCommand sql = conn.CreateCommand())
            {
                sql.CommandText = query;
                if (dbparams != null)
                {
                    if (dbparams.Count > 0)
                    {
                        sql.Parameters.AddRange(dbparams.ToArray());
                    }
                }

                MySqlDataReader reader = sql.ExecuteReader();
                Console.WriteLine("Reading data : " + reader.HasRows + reader.FieldCount);

                sql.Parameters.Clear();
                return reader;
            }*/
        }

    }
这些脚本返回以下内容:

Connecting local : 5.5.16
Reading data : True2
Reading data : False0

您希望从
using语句中返回
数据读取器
,该语句将隐式关闭基础连接

我建议使用以下模式,而不是返回
DataReader
。你可以让步


因此,您不需要将所有数据加载到内存中,只需获取其中的一小部分。

您希望从
using语句中返回一个
数据读取器,该语句将隐式关闭底层连接

我建议使用以下模式,而不是返回
DataReader
。你可以让步


因此,您不需要将所有内容加载到内存中,只需获取其中的一小部分。

在我看来,您在使用读卡器之前正在处理连接。只有在使用完读卡器后,才尝试断开连接。

在我看来,您是在使用读卡器之前断开连接的。只有在处理完读卡器后,才可以尝试处理连接。

当从MySqlConnection块退出时,您的读卡器没有可使用的连接,您可以在MySqlConnection块中创建读卡器

一个可能的解决方案,但效率较低,是使用Fill方法获取数据集。 这不仅效率较低,而且,如果需要处理数据行,您会发现自己在这些行上再次循环

public DataSet localfetchrows(string query, List<MySqlParameter> dbparams = null) 
{ 
    DataSet ds;
    using (var conn = connectLocal()) 
    { 
        Console.WriteLine("Connecting local : " + conn.ServerVersion); 
        MySqlCommand sql = conn.CreateCommand(); 
        sql.CommandText = query; 
        if (dbparams != null) 
        { 
            if (dbparams.Count > 0) 
            { 
                sql.Parameters.AddRange(dbparams.ToArray()); 
            } 
        } 
        MySqlDataReader reader = sql.ExecuteReader(); 
        Console.WriteLine("Reading data : " + reader.HasRows + reader.FieldCount); 
        reader.Fill(ds);
        return ds; 
    }
}
公共数据集localfetchrows(字符串查询,列表dbparams=null) { 数据集ds; 使用(var conn=connectLocal()) { Console.WriteLine(“连接本地:+conn.ServerVersion”); MySqlCommand sql=conn.CreateCommand(); sql.CommandText=查询; if(dbparams!=null) { 如果(dbparams.Count>0) { AddRange(dbparams.ToArray()); } } MySqlDataReader=sql.ExecuteReader(); Console.WriteLine(“读取数据:+reader.HasRows+reader.FieldCount”); 读卡器。填写(ds); 返回ds; } }
您使用块在MySqlConnection中创建读卡器,当从该块退出时,您的读卡器没有可使用的连接

一个可能的解决方案,但效率较低,是使用Fill方法获取数据集。 这不仅效率较低,而且,如果需要处理数据行,您会发现自己在这些行上再次循环

public DataSet localfetchrows(string query, List<MySqlParameter> dbparams = null) 
{ 
    DataSet ds;
    using (var conn = connectLocal()) 
    { 
        Console.WriteLine("Connecting local : " + conn.ServerVersion); 
        MySqlCommand sql = conn.CreateCommand(); 
        sql.CommandText = query; 
        if (dbparams != null) 
        { 
            if (dbparams.Count > 0) 
            { 
                sql.Parameters.AddRange(dbparams.ToArray()); 
            } 
        } 
        MySqlDataReader reader = sql.ExecuteReader(); 
        Console.WriteLine("Reading data : " + reader.HasRows + reader.FieldCount); 
        reader.Fill(ds);
        return ds; 
    }
}
公共数据集localfetchrows(字符串查询,列表dbparams=null) { 数据集ds; 使用(var conn=connectLocal()) { Console.WriteLine(“连接本地:+conn.ServerVersion”); MySqlCommand sql=conn.CreateCommand(); sql.CommandText=查询; if(dbparams!=null) { 如果(dbparams.Count>0) { AddRange(dbparams.ToArray()); } } MySqlDataReader=sql.ExecuteReader(); Console.WriteLine(“读取数据:+reader.HasRows+reader.FieldCount”); 读卡器。填写(ds); 返回ds; } }
使用(var conn=connectLocal())

您将连接放置在using语句中,从而在到达此行后关闭并处理连接:

return reader;
换句话说,当调用方返回
读取器时,您已经关闭了数据库连接,无法获取行。读取行时必须打开连接。

使用(var conn=connectLocal())

您将连接放置在using语句中,从而在到达此行后关闭并处理连接:

return reader;
换句话说,当调用方返回
读取器时,您已经关闭了数据库连接,无法获取行。读取行时必须打开连接

return reader;