我正在尝试使用给定字段的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();
感谢您的帮助
答案 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#
实现GetSomeDatapublic 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;
}
}
}
}