none
C#谁解释一下这段代码! RRS feed

  • 问题

  • SqlConnection con = new SqlConnection("Server=.\\SQLEXPRESS;uid=sa;pwd=59365615;database=Attendance Manage");
                con.Open();
                try
                {
                    string strsql = "select * from table_table1";
                    SqlCommand cmd = new SqlCommand(strsql, con);
                    SqlDataReader reader = cmd.ExecuteReader();
                    string str = "";
                    for (int i = 0; i < reader.FieldCount; i++)//这句看不懂
                        str += string.Format("{0,-10}", reader.GetName(i));//这句话看不懂。。
                    str += "\n";
                    while (reader.Read())
                    {
                        for (int i = 0; i < reader.FieldCount; i++)
                            str += string.Format("{0,-10}", reader.GetName(i));
                        str += "\n";
                    }
                    label1.Text = str;
                }
                catch (SqlException err)
                {
                    label1.Text = "无法读取数据";
                }
                finally
                {             
                    con.Close();
                }
    2011年11月8日 1:44

答案

  • 怎么我运行出来的是表字段的名称呢?我有一张表,表里的字段是2列,数据是2条,运行结果得到3条表的字段名,我搞不懂了。。

    fieldcount是什么意思?
    如果一个数据表里有
    学号  姓名 年龄
    1       马六  11
    2       张三  12
    3      李四    13
    4      王五    14
    那么这里fieldcount得到有几个字段?


    正如我说的——FieldCount运行出来的是数据表的“列”的数量。应该是3.你遍历出来就是“学号 姓名 年龄”。

    如果你想得到数据,应该:

    string strsql = "select * from table_table1";
    SqlCommand cmd = new SqlCommand(strsql, con);
    SqlDataReader reader = cmd.ExecuteReader();
    string s="";
    while(reader.Read())  //读取行
    {
        for(int i=0;i<reader.FieldCount;++i)   //读取列
        {
             s+= reader[i].ToString()+"\t";
        }
    s+="\n";
    }


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2011年11月8日 2:18
    版主
  • 第一问:之所以要临时变量,是因为你同样需要保留先前读到的数据。然后使用“+”拼接字符串的方式完整地拼接成一个内容。

    第二问:{0,-10}表示左对齐留出10个字符。实际是被reader.GetValue(0)取代。如果reader.GetValue(0)读取的内容小于10个字符,那么右边将会用空格填充。

    具体关于StringFormat格式化内容,请参考:http://www.cnblogs.com/oletan/archive/2010/04/27/1722283.html


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    • 已标记为答案 深白 2011年11月8日 3:34
    2011年11月8日 3:29
    版主

全部回复

  • 循环把记录里的所有字段值读出来
    http://feiyun0112.cnblogs.com/
    2011年11月8日 2:11
    版主
  •  for (int i = 0; i < reader.FieldCount; i++)                //判断这个数据表中有多少个列字段。FieldCount就是这个作用
    str += string.Format("{0,-10}", reader.GetName(i)); //获取每一列的列名称
    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年11月8日 2:14
    版主
  • 怎么我运行出来的是表字段的名称呢?我有一张表,表里的字段是2列,数据是2条,运行结果得到3条表的字段名,我搞不懂了。。

    fieldcount是什么意思?
    如果一个数据表里有
    学号  姓名 年龄
    1       马六  11
    2       张三  12
    3      李四    13
    4      王五    14
    那么这里fieldcount得到有几个字段?

    2011年11月8日 2:14
  • 怎么我运行出来的是表字段的名称呢?我有一张表,表里的字段是2列,数据是2条,运行结果得到3条表的字段名,我搞不懂了。。

    fieldcount是什么意思?
    如果一个数据表里有
    学号  姓名 年龄
    1       马六  11
    2       张三  12
    3      李四    13
    4      王五    14
    那么这里fieldcount得到有几个字段?


    正如我说的——FieldCount运行出来的是数据表的“列”的数量。应该是3.你遍历出来就是“学号 姓名 年龄”。

    如果你想得到数据,应该:

    string strsql = "select * from table_table1";
    SqlCommand cmd = new SqlCommand(strsql, con);
    SqlDataReader reader = cmd.ExecuteReader();
    string s="";
    while(reader.Read())  //读取行
    {
        for(int i=0;i<reader.FieldCount;++i)   //读取列
        {
             s+= reader[i].ToString()+"\t";
        }
    s+="\n";
    }


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2011年11月8日 2:18
    版主
  • while (reader.Read())
                    {
                        for (int i = 0; i < reader.FieldCount; i++)
                            str += string.Format("{0,-10}", reader.GetValue(i));//原来是我看错了,这里是getvalue不是getname
                        str += "\n";
                    }

    2011年11月8日 2:26
  • select语句如果得到多条数据的话, while (reader.Read())是不是就是把数据一条一条的放进while语句里处理?
    2011年11月8日 2:33
  • select语句如果得到多条数据的话, while (reader.Read())是不是就是把数据一条一条的放进while语句里处理?

    是的。Read方法返回一个布尔类型的数值,如果是true表示继续读下一行。false表示停止读取(读取完毕)了。
    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年11月8日 2:35
    版主
  • while (reader.Read())
                    {
                        for (int i = 0; i < reader.FieldCount; i++)
                            str += string.Format("{0,-10}", reader.GetValue(i));//原来是我看错了,这里是getvalue不是getname
                        str += "\n";
                    }


    GetValue是获取列里边的东西;但是GetName是获取列名。
    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年11月8日 2:44
    版主
  •                  string str = "";//定义一个字符串变量临时存放数据表的读取结果           
                    for (int i = 0; i < reader.FieldCount; i++)
                        str += string.Format("{0,-10}", reader.GetName(i));
                    str += "\n";

                    while (reader.Read())//逐条读取数据表记录
                    {
                        for (int i = 0; i < reader.FieldCount; i++)
                            str += string.Format("{0,-10}", reader.GetValue(i));
                        str += "\n";
                    }
                    label1.Text = str;
                }
    为什么要有个临时表存放的结果然后读取呢?直接读不行吗?还有string.format("{0,-10}", reader.GetValue(i));//这里{0,-10}是什么意思?


    • 已编辑 深白 2011年11月8日 3:00
    2011年11月8日 2:51
  • 第一问:之所以要临时变量,是因为你同样需要保留先前读到的数据。然后使用“+”拼接字符串的方式完整地拼接成一个内容。

    第二问:{0,-10}表示左对齐留出10个字符。实际是被reader.GetValue(0)取代。如果reader.GetValue(0)读取的内容小于10个字符,那么右边将会用空格填充。

    具体关于StringFormat格式化内容,请参考:http://www.cnblogs.com/oletan/archive/2010/04/27/1722283.html


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    • 已标记为答案 深白 2011年11月8日 3:34
    2011年11月8日 3:29
    版主