mysql数据读取从类返回0行

时间:2012-07-09 20:52:36

标签: c# mysql mysqldatareader

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

但是返回函数不起作用,我知道查询会带回行但是当它返回时它有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;
            }*/
        }

    }

获取结果的代码

query = @"SELECT jobtypeid, title FROM jobtypes WHERE active = 'Y' ORDER BY title ASC";
            //parentfrm.jobtypes = db.localfetchrows(query);
            var rows = db.localfetchrows(query);
            Console.WriteLine("Reading data : " + rows.HasRows + rows.FieldCount);
            while (rows.Read()){

            }

这些脚本返回以下内容:

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

4 个答案:

答案 0 :(得分:2)

您希望从DataReader中返回using-statement,这将隐含地关闭基础连接。

而不是返回DataReader我会建议遵循模式。你可以得到IEnumerable<IDatarecord>

public IEnumerable<IDataRecord> localfetchrows(string query, List<MySqlParameter> dbparams = null)
{
    using (var conn = connectLocal())
    {
        MySqlCommand sql = conn.CreateCommand();
        sql.CommandText = query;
        if (dbparams != null)
        {
            if (dbparams.Count > 0)
            {
                sql.Parameters.AddRange(dbparams.ToArray());
            }
        }

        conn.Open();
        using (IDataReader rdr = sql.ExecuteReader())
        {
            while (rdr.Read())
            {
                yield return (IDataRecord)rdr;
            }
        }
    }
}

您可以通过以下方式调用它:

var records = localfetchrows(query);
foreach (var rec in records.Take(10))
{ 
     Console.WriteLine("Reading data : " + rec.FieldCount);
}

因此,您不需要将所有内容加载到内存中,只需占用一小部分内容即可。

答案 1 :(得分:1)

使用块在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; 
    }
}

答案 2 :(得分:1)

using (var conn = connectLocal())

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

return reader;

换句话说,当调用者返回reader时,您已关闭数据库连接并且无法获取行。读取行时必须打开连接。

答案 3 :(得分:0)

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