使用IEnumerable <idatarecord>返回数据

时间:2016-10-31 12:50:23

标签: c# sql string ienumerable reader

我正在尝试使用给定字段的IEnumerable返回数据,其中我调用的方法是我想用给定的字段名称引用数据并返回。

示例,这是函数

    public IEnumerable<IDataRecord> GetSomeData(string fields, string table, string where = null, int count = 0)
    {
        string sql = "SELECT @Fields FROM @Table WHERE @Where";

        using (SqlConnection cn = new SqlConnection(db.getDBstring(Globals.booDebug)))
        using (SqlCommand cmd = new SqlCommand(sql, cn))
        {
            cmd.Parameters.Add("@Fields", SqlDbType.NVarChar, 255).Value = where;

            cn.Open();

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

通话:

IEnumerable<IDataRecord> data = bw.GetSomeData("StaffCode, Perms", "BW_Staff", "StaffCode = 'KAA'");

我该怎样做才能以这种方式或以何种方式返回数据?

string staffCode = data["StaffCode"].ToString();
string perms = data["Perms"].ToString();

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

您的数据变量是行的集合。您需要遍历集合以对每行执行一些有趣的操作。

foreach (var row in data)
{
    string staffCode = row["StaffCode"].ToString();
    string perms = row["Perms"].ToString();
}

<强>更新

根据你的评论,你只希望GetSomeData(...)返回一行,我建议两件事中的一件。

更改GetSomeData的签名以返回IDataRecord。并删除&#34; yield&#34;从实施。

public IDataRecord GetSomeData(string fields, string table, string where = null, int count = 0)
    {
        string sql = "SELECT @Fields FROM @Table WHERE @Where";

        using (SqlConnection cn = new SqlConnection(db.getDBstring(Globals.booDebug)))
        using (SqlCommand cmd = new SqlCommand(sql, cn))
        {
            cmd.Parameters.Add("@Fields", SqlDbType.NVarChar, 255).Value = where;

            cn.Open();

            using (IDataReader rdr = cmd.ExecuteReader())
            {
                while (rdr.Read())
                {
                    return (IDataRecord)rdr;
                }
            }
        }
    }
}

或者

var row = data.FirstOrDefault();
if (row != null)
{
    string staffCode = row["StaffCode"].ToString();
    string perms = row["Perms"].ToString();
}

<强>说明:

您的GetSomeData实现不完整。您甚至没有使用多个参数,最重要的是fields参数。从概念上讲,在SQL中,您无法参数化返回哪些字段或使用哪个表(等等),而是需要构建动态查询并执行它。

更新2

以下是构建正确查询的GetSomeData实现(在C#6中,如果您在早期版本中需要它,请告诉我。)

public IEnumerable<IDataRecord> GetSomeData(IEnumerable<string> fields, string table, string where = null, int count = 0)
{
    var predicate = string.IsNullOrWhiteSpace(where) ? "" : " WHERE " + where;
    string sql = $"SELECT { string.Join(",", fields) } FROM {table} {predicate}";

    using (SqlConnection cn = new SqlConnection(db.getDBstring(Globals.booDebug)))
    using (SqlCommand cmd = new SqlCommand(sql, cn))
    {
        cn.Open();

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

以下是您将如何使用它。

IEnumerable<IDataRecord> data = bw.GetSomeData(new[] { "StaffCode", "Perms" }, "BW_Staff", "StaffCode = 'KAA'");

你可以枚举它或者调用.FirstOrDefault,这是你的选择。每次调用GetSomeData时,它都会运行查询。

更新3

使用早期版本的C#

实现GetSomeData
public IEnumerable<IDataRecord> GetSomeData(IEnumerable<string> fields, string table, string where = null, int count = 0)
{
    var predicate = string.IsNullOrEmpty(where) ? "" : " WHERE " + where;
    string sql = string.Format("SELECT {0} FROM {1} {2}", string.Join(",", fields), table, predicate);

    using (SqlConnection cn = new SqlConnection(db.getDBstring(Globals.booDebug)))
    using (SqlCommand cmd = new SqlCommand(sql, cn))
    {
        cn.Open();

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