按行和列名称从DataTable获取值

时间:2014-12-15 18:09:15

标签: c# asp.net sql-server-2008 stored-procedures datatable

我通常习惯SQL中的传统表格,其中我有多个columns,其中填充了行。我执行一个存储过程并将所有数据存储在DataTable中并循环遍历表以获得我需要的结果。例如,

 public static DataTable getInfo (string sessionID)
    {
        try
        {
            SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["SandBox"].ConnectionString);
            SqlCommand cmd = new SqlCommand("GetSessionInfo", conn);
            cmd.Parameters.AddWithValue("SessionGUID", sessionID);
            cmd.CommandType = CommandType.StoredProcedure;
            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(dt);
            return dt;
        }
        catch (Exception)
        {

            throw;
        }
    }

我会加载DataTable:

 DataTable infoTbl = new DataTable();
 infoTbl = getInfo(lbldatabasesessionID.Text);

我会使用foreach循环遍历DataTable。

foreach (DataRow row in infoTbl.Rows)
{
   string x = col.ToString();
}

我遇到的问题是数据库人员给了我一个存储过程,它返回一个不同的输出(与我以前的不同)。这是基于行的。

enter image description here

我可以访问的唯一方法,例如First Name,如果我硬编码的位置如下:

string firstName = infoTbl.Rows[16][2].ToString();

由于这个职位可能会发生变化,所以我觉得这样做并不舒服。如何通过了解知道ElementValueElementType的名称来访问ElementName

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

使用DataSet:

        string firstName = string.Empty;

        DataRow row = table.Select("ElementType = 'Demographics' AND ElementName = 'FirstName'").FirstOrDefault();

        if (row != null)
        {
            firstName = (string)row["ElementValue"];
        }

使用Linq:

        string firstName = table.AsEnumerable()
            .Where(f => f.Field<string>("ElementType") == "Demographics" && 
                f.Field<string>("ElementName") == "FirstName")
            .Select(f => f.Field<string>("ElementValue")).FirstOrDefault();