如何使用列名datatable获取datarow单元格值

时间:2014-06-15 05:03:08

标签: c# sql datatable sqldatareader sqldataadapter

让我先告诉你我现在正在做什么以及我面临的问题。

现在我使用SqlDataReader从数据库中获取数据,我的函数看起来像

 public List<TOPIC_REPORT> gettopicreports()
        {
            query = "SELECT * FROM [Topic Reports]";
            List<TOPIC_REPORT> rpl = new List<TOPIC_REPORT>();
            try
            {
                con.Open();
                com = new SqlCommand(query, con);
                sdr = com.ExecuteReader();
                while (sdr.Read())
                {
                    rt = new TOPIC_REPORT();
                    rt.ContentId = sdr.GetString(0);
                    rt.TimesReported = sdr.GetInt64(1);
                    rt.IsBanned = sdr.GetInt32(2);
                    rpl.Add(rt);

                }
                con.Close();
                return rpl;

            }
            catch (Exception e)
            {
                con.Close();
                throw e;
            }
        }

上述代码的问题

  1. 需要将值分配给一个类变量,并且需要多个选择查询。
  2. 需要注意ResultSet,while loop等。
  3. Above Problem解决方案使用SqlDataAdapter。

    public DataSet getdata()
            {
                com.CommandText = "GetMasterPageData";
                com.Connection = con;
                com.CommandType = CommandType.StoredProcedure;
                con.Open();
                SqlDataAdapter adapter = new SqlDataAdapter(com);
                DataSet ds = new DataSet();
                adapter.Fill(ds);
                con.Close();
                return ds;
            } 
    

    这解决了上述问题,但

    1. 降低我的编程可读性,因为我的前端人员不知道我在DataSet中发送DataTables的顺序。
    2. 不知道DataTable中所选值的顺序。
    3. 前端人员需要处理最终的列索引会有问题。
    4. 建议我如何解决上述问题。

1 个答案:

答案 0 :(得分:0)

您可以通过组合所有查询来更改查询以返回多个结果集。例如:

query = "SELECT * FROM [Topic Reports]; SELECT * FROM [Other table]";

使用SqlDataReader.Read迭代第一个结果集后,使用SqlDataReader.NextResultSet()方法获取第二个结果,然后使用SqlDataReader.Read迭代第二个结果。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.nextresult(v=vs.110).aspx

作为旁注,如果你这样做,那么你将不得不想办法从你的方法中返回两种类型对象的集合。最好只使用1方法来获取对象A的集合,并使用不同的方法来获取对象B的集合。