当前位置:编程学习 > C#/ASP.NET >>

字段名的显示问题 急(C#) 在线等

   大家好,我在用Gridview的时候,从数据库里面取出数据进行绑定。有3个表,
   表一:学生ID,学生姓名;
   表二:课程ID,课程名;
    表三:学生ID,课程ID,成绩;
 要在GridView里面成如下显示:
姓名  语文    化学    外语   物理   总分
张三  60     60      60    76    256
李四   0     0        0     0     0
王五   0      0       0     0     0
  
我在绑定数据的时候,在GridView里面显示却是:
               KCName
语文
化学
外语
物理

我写的代码如下,希望大家帮忙解释一下。谢谢。
private void GridviewBind()
    {
        DataSet ds = new DataSet();
        try
        {
            SqlConnection con = DB.CreateCon();
            if (con.State.ToString() == "Close") con.Open();
            SqlDataAdapter SdaKemu = new SqlDataAdapter("select KCName from KC", con);//从课程表里取课程名
            DataTable DtKemu = new DataTable();
           SdaKemu.Fill(ds, "Kemu");
            for (int i = 0; i < ds.Tables["Kemu"].Rows.Count; i++)
            {
                DtKemu.Columns.Add(ds.Tables["Kemu"].Rows[i]["KCName"].ToString());
            }
            
           
            if (con.State.ToString() == "Open") con.Close();
            GV.DataSource = ds.Tables["Kemu"];
            GV.DataBind();


        }
        catch (Exception ex)
        {
            Response.Write("数据库出错,错误原因" + ex.Message);
            Response.End();
        }
    }

    
     --------------------编程问答-------------------- 你只从一个表里选择了数据。你还需要做行列转换等其它工作。 --------------------编程问答-------------------- 呵呵,甚至连成绩从哪里取出来也没有看出来。 --------------------编程问答-------------------- 没有原因,"select KCName from KC"你只查出了这一条当然就只显示这一条了,
--------------------编程问答-------------------- 如果你的课程表里的内容变化不大的化,就可以写个视图,按你的要显示的那样先做好视图,

--------------------编程问答--------------------

/*
标题:普通行列转换(version 2.0)
作者:爱新觉罗.毓华 
时间:2008-03-09
地点:广东深圳
说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。

问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果): 
姓名 语文 数学 物理 
---- ---- ---- ----
李四 74   84   94
张三 74   83   93
-------------------
*/

create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
go

--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
select 姓名 as 姓名 ,
  max(case 课程 when '语文' then 分数 else 0 end) 语文,
  max(case 课程 when '数学' then 分数 else 0 end) 数学,
  max(case 课程 when '物理' then 分数 else 0 end) 物理
from tb
group by 姓名

--------------------编程问答-------------------- 主要看下面的方法一与方法二,将表名和字段名改为你的即可
--方法一
SELECT B.姓名,
(SELECT 成绩 FROM 成绩表 INNER JOIN 课程 ON 成绩表.课程ID=课程.课程ID WHERE 成绩表.学生ID=B.学生ID AND 课程.课程名='语文' ) AS 语文,
(SELECT 成绩 FROM 成绩表 INNER JOIN 课程 ON 成绩表.课程ID=课程.课程ID WHERE 成绩表.学生ID=B.学生ID AND 课程.课程名='化学' ) AS 化学,
(SELECT 成绩 FROM 成绩表 INNER JOIN 课程 ON 成绩表.课程ID=课程.课程ID WHERE 成绩表.学生ID=B.学生ID AND 课程.课程名='外语' ) AS 外语,
(SELECT 成绩 FROM 成绩表 INNER JOIN 课程 ON 成绩表.课程ID=课程.课程ID WHERE 成绩表.学生ID=B.学生ID AND 课程.课程名='物理' ) AS 物理
FROM 学生 B

--方法二
SELECT 姓名,
MAX(CASE 课程名 WHEN '语文' THEN 成绩 ELSE 0 END) AS 语文,
MAX(CASE 课程名 WHEN '化学' THEN 成绩 ELSE 0 END) AS 化学,
MAX(CASE 课程名 WHEN '外语' THEN 成绩 ELSE 0 END) AS 外语,
MAX(CASE 课程名 WHEN '物理' THEN 成绩 ELSE 0 END) AS 物理
FROM (SELECT B.姓名,C.课程名,D.成绩 FROM 成绩表 D 
INNER JOIN 学生 B ON B.学生ID=D.学生ID 
INNER JOIN 课程 C ON C.课程ID=D.课程ID) AS TMP GROUP BY 姓名


测试代码.直接在SQL查询分析器即可运行

CREATE TABLE 学生 (学生ID INT, 姓名 VARCHAR(20))
CREATE TABLE 课程 (课程ID INT, 课程名 VARCHAR(20))
CREATE TABLE 成绩表 (学生ID INT, 课程ID INT, 成绩 INT)

INSERT INTO 学生
SELECT 1,'张三' UNION ALL
SELECT 2,'李四' UNION ALL
SELECT 3,'王五'

INSERT INTO 课程
SELECT 1,'语文' UNION ALL
SELECT 2,'化学' UNION ALL
SELECT 3,'外语' UNION ALL
SELECT 4,'物理'

INSERT INTO 成绩表
SELECT 1,1,60 UNION ALL
SELECT 1,2,70 UNION ALL
SELECT 1,3,65 UNION ALL
SELECT 1,4,90 UNION ALL
SELECT 2,1,80 UNION ALL
SELECT 2,2,65 UNION ALL
SELECT 2,3,85 UNION ALL
SELECT 2,4,80 UNION ALL
SELECT 3,1,50 UNION ALL
SELECT 3,2,75 UNION ALL
SELECT 3,3,85 UNION ALL
SELECT 3,4,60

--方法一
SELECT B.姓名,
(SELECT 成绩 FROM 成绩表 INNER JOIN 课程 ON 成绩表.课程ID=课程.课程ID WHERE 成绩表.学生ID=B.学生ID AND 课程.课程名='语文' ) AS 语文,
(SELECT 成绩 FROM 成绩表 INNER JOIN 课程 ON 成绩表.课程ID=课程.课程ID WHERE 成绩表.学生ID=B.学生ID AND 课程.课程名='化学' ) AS 化学,
(SELECT 成绩 FROM 成绩表 INNER JOIN 课程 ON 成绩表.课程ID=课程.课程ID WHERE 成绩表.学生ID=B.学生ID AND 课程.课程名='外语' ) AS 外语,
(SELECT 成绩 FROM 成绩表 INNER JOIN 课程 ON 成绩表.课程ID=课程.课程ID WHERE 成绩表.学生ID=B.学生ID AND 课程.课程名='物理' ) AS 物理
FROM 学生 B

--方法二
SELECT 姓名,
MAX(CASE 课程名 WHEN '语文' THEN 成绩 ELSE 0 END) AS 语文,
MAX(CASE 课程名 WHEN '化学' THEN 成绩 ELSE 0 END) AS 化学,
MAX(CASE 课程名 WHEN '外语' THEN 成绩 ELSE 0 END) AS 外语,
MAX(CASE 课程名 WHEN '物理' THEN 成绩 ELSE 0 END) AS 物理
FROM (SELECT B.姓名,C.课程名,D.成绩 FROM 成绩表 D 
INNER JOIN 学生 B ON B.学生ID=D.学生ID 
INNER JOIN 课程 C ON C.课程ID=D.课程ID) AS TMP GROUP BY 姓名


DROP TABLE 学生
DROP TABLE 课程
DROP TABLE 成绩表
--------------------编程问答-------------------- 楼上二位用得如火纯青 --------------------编程问答-------------------- private void GridviewBind() 
    { 
        DataSet ds = new DataSet(); //实力化一个dataset对象
        try //捕捉异常 
        { 
            SqlConnection con = DB.CreateCon(); //声明SqlConnection 类型对象
            if (con.State.ToString() == "Close") con.Open();  判断状态
            SqlDataAdapter SdaKemu = new SqlDataAdapter("select KCName from KC", con);//从课程表里取课程名 
            DataTable DtKemu = new DataTable();  // 实力化一个DataTable 对象
           SdaKemu.Fill(ds, "Kemu"); 
            for (int i = 0; i  < ds.Tables["Kemu"].Rows.Count; i++)
//做FOR循环 如果ds.Tables["Kemu"].Rows.Count 大于I  I++继续循环
            { 
                DtKemu.Columns.Add(ds.Tables["Kemu"].Rows[i]["KCName"].ToString()); //向DtKemu 集合添加数据
            } 
             
            
            if (con.State.ToString() == "Open") con.Close();  判断状态 =TRUE  关闭连接
            GV.DataSource = ds.Tables["Kemu"];  绑顶数据
            GV.DataBind(); 


        } 
        catch (Exception ex)  //抛出异常
        { 
            Response.Write("数据库出错,错误原因" + ex.Message); 
            Response.End(); 
        } 
    } 

--------------------编程问答--------------------
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,