有一段程序,在未修改之前可以运行正常。本人想添加一个与之前有一样效果的GridView控件,于是对GridView5控件进行复制。修改了一下其中的一些小控件ID之后,对后台.cs相关代码也页进行了相同的复制,但是运行后报了题目中所示的的错误。
aspx页面的代码:
<asp:GridView ID="GridView6" runat="server" Width="100%" AutoGenerateColumns="False" BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px" CellPadding="3">
<Columns>
   <asp:TemplateField HeaderText="综合题">
      <ItemTemplate>
        <table id="Table7" cellspacing="1" cellpadding="1" width="100%" align="center" border="0">
            <tr>
      <td>
 <asp:Label id="Label24" runat="server" Text='<%# Container.DataItemIndex+1 %>'>                     
                 </asp:Label>
 <asp:Label id="Label25" runat="server" Text='<%# Eval("Title","、{0}") %>'>(报错的地方)
 </asp:Label>
 <asp:TextBox id="txtAnswer1" runat="server" Width="100%" TextMode="MultiLine"></asp:TextBox>                 
 <asp:Label id="Label26" runat="server" Text='<%# Eval("ID") %>' Visible="False">
 </asp:Label>                 
      </td>
    </tr>
 </table>
       </ItemTemplate>
   </asp:TemplateField>
</Columns>
</asp:GridView>.cs代码:
        SqlParameter[] Params6 = new SqlParameter[2];
        Params6[0] = DB.MakeInParam("@PaperID", SqlDbType.Int, 4, paperID);               //试卷编号
        Params6[1] = DB.MakeInParam("@Type", SqlDbType.VarChar, 10, "综合题");            //题目类型        
        DataSet ds6 = DB.GetDataSet("Proc_PaperDetail", Params6);
        GridView6.DataSource = ds6;
        GridView6.DataBind();
DB.GetDataSet的代码:
public DataSet GetDataSet(string ProcName, SqlParameter[] Params)
{
     Open();
     SqlCommand Cmd = CreateCommand(ProcName, Params);
     SqlDataAdapter adapter = new SqlDataAdapter(Cmd);
     DataSet dataset = new DataSet();
     adapter.Fill(dataset);
     Close();
     return dataset;
}这段代码是仿照复制添加GridView6前GridView5的代码进行修改的,运用到了存储过程(本人对这个不太懂),会不会是只复制添加了前面两段代码,对存储过程中sql语句没有成对添加?是不是 GridView6.DataSource = ds6那里导致出的错?
有个疑问就是有好几种题型和几个ds,代码都差不多,如何知道某个ds绑定了哪个数据表进行数据读取的操作呢?
找遍了所有代码,找不到ds跟数据库交互的sql语句。
求助!!!!

解决方案 »

  1.   

    BS很久没搞过,,首先要看数据库中字段是否也叫‘Title’,其次你那写法是否正确。。
      

  2.   

    看看你绑定的数据源里有没有叫title的字段,数据源里名字是什么,就得写什么
      

  3.   

     GridView6.DataSource = ds6;
    这个是GW绑定DS  DataSource 等于的是ds几 绑定的就是哪个DS
    DataSet dataset = new DataSet();
         adapter.Fill(dataset);
    这个是给DS赋值 这个函数返回类型就是dataset 调用这个函数就是给DS赋值了
      

  4.   

       <asp:Label id="Label25" runat="server" Text='<%# Eval("Title","、{0}") %>'>(报错的地方)
    红色部分我还真没看懂,什么意思》有一个"、"
      

  5.   

    有个疑问就是有好几种题型和几个ds,代码都差不多,如何知道某个ds绑定了哪个数据表进行数据读取的操作呢?
    既然代码差不多,写一个通用的函数就可以了啊,这个你可以在ds中添加一列,来表示添加的那个数据源表
      

  6.   

    数据表里面有Title字段的。就是在没有复制添加之前是可以正常运行的,写法正确,在同时复制了数据表字段属性创建了新表之后,却运行不了了。
      

  7.   

    那怎么查看具体的ds的操作呢,就是ds是怎么跟数据库进行交互的,从上面的代码看不出来具体的sql语句呀。麻烦了~
      

  8.   

    那你自己找找吧,查找好简单嘛,Ctrl+F
      

  9.   

    我把.cs中的
    Params6[1] = DB.MakeInParam("@Type", SqlDbType.VarChar, 10, "综合题");中的"综合题"改成了与程序复制来源处相同"问答题",aspx页面中的的'Title'不变,这样的话能够正常的显示出问答题来。问题是数据库中我的“综合题”的表是复制自“问答题”表,里面的字段属性也是一样的,为什么就会报错呢?麻烦大虾啦!!
      

  10.   

    你先调试看看ds6.Table[0].Rows[0]["Title"]是什么值。。 随便用个变量定义一下。。 看看调试出来时什么!! 如果有值 恐怕就是你的前台代码有问题了!!
      

  11.   

    我分别在ds5和ds6后面加了语句:
    DataSet ds5 = DB.GetDataSet("Proc_PaperDetailmr", Params5);
    GridView5.DataSource = ds5;
    GridView5.DataBind();string ceshi = "";
    ceshi = ds5.Tables[0].Rows[0]["Title"].ToString();
    断点调试之后ceshi=""的了为什么ds5能正常显示的GridView,得到的也是NULL值呢?
      

  12.   

    截图中是问答题和综合题两个表单的字段属性:
    问答题综合题
    [img=http://hi.baidu.com/solely00/album/item/3b93efd1a9ec8a1316c52e57f703918fa2ecc0fc.html#IMG=66c4fc067bf40ad10d3bbe54572c11dfabeccefcimg]
    会不会是在其他地方涉及到每个ds和每个GridView进行数据的绑定
      

  13.   

    GridView5.DataSource = ds5;
    就这么结束了?
    你忘记设置DataMember属性了,如果你的DataSource是DataTable,那么不需要设置DataMember属性,但是你现在是DataSet
      

  14.   

    您是指GridView6的DataMember属性吗?我这边的这个属性是个下拉框,但是里面是空的,没办法选
    另在我未作修改前,也是只写了GridView5.DataSource = ds5;能够正常运行的。
      

  15.   

    你看看GridView5的页面部分是否设置了那个属性,ASP.NET的标签属性既可以前台设置,也可以后台设置,DataSet做数据源的话,不设置DataMember,它就不知道绑定里面的哪个表了。
      

  16.   

    嗯刚才仔细查看了之前的每一个GridView,里面的DataMember属性值都是空的,下拉框都没有选项,后台也没看到相应的代码设置我也一直没弄个明白,仅靠DataSet ds5 = DB.GetDataSet("Proc_PaperDetailmr", Params5);和GridView5.DataSource = ds5;ds是怎么知道要绑定哪个具体的数据表单的?
    方便加个QQ吗,非常感谢您~!327578710
      

  17.   

    下拉里面空的很正常,因为你不是通过它的数据控件绑定的,设计时不知道那个DataSet的存在,但是你可以自己填写里面可能存在的表名进去。
    另外我只是给你一个建议,毕竟我现在主要搞WinForm的开发,WEB是我C#入门时搞的,时间长了,也许问题不在那里,但是多一个可能性也是好的。
      

  18.   

    我把GridView6对应的综合题的表单名加入到了DataMember属性中,但是运行后报错说IListSource不包含该数据源主要还是       
    Params6[0] = DB.MakeInParam("@PaperID", SqlDbType.Int, 4, paperID); 
    Params6[1] = DB.MakeInParam("@Type", SqlDbType.VarChar, 10, "综合题");      
    DataSet ds6 = DB.GetDataSet("Proc_PaperDetail", Params6);这里是调用了存储过程,先是找到一张表,该表是一张试卷中所有题目的汇总,字段有试卷编号、题目类型type和标题ID,然后根据题目类型type和标题ID来找到每种题型各自的表单,里面字段有ID、CourseID、Title、Answer等。
    现在我搞不清楚的就是它是怎么实现“根据题目类型type和标题ID来找到每种题型各自的表单”的后台代码里面都找不到。
    非常感谢你的耐心回答!!鞠躬~
      

  19.   

    Proc_PaperDetail这个存储过程怎么写的?或者你直接把AutoGenerateColumns="False" 改为AutoGenerateColumns="True"后,将GridView6的列定义都删除,这样它会自动产生所有的列,你根据自动产生的列来检查里面是否包含Title列。
      

  20.   

    在1楼中把aspx代码贴出来了,GridView6里面是几个Lable标签,不是我们常见的那种GridView表格,所以不太好把列定义都删除。Proc_PaperDetail只是一个存储名字,找不到具体的过程,按F12也找不到在1楼的代码中调用了GetDataSet()(GetDataSet中再调用CreateCommand())
    private SqlCommand CreateCommand(string ProcName, SqlParameter[] Prams) 
    {
       Open();
       SqlCommand Cmd = new SqlCommand(ProcName, Connection);
       Cmd.CommandType = CommandType.StoredProcedure;
       if (Prams != null) 
       {
          foreach (SqlParameter Parameter in Prams)
          Cmd.Parameters.Add(Parameter);
       }
       return Cmd;
    }
    哎,身边有个擅长这个存储过程的高手就好了自学就是困难啊
      

  21.   

    断点调试时,ds6的值全部都是null值,说明没有连上数据源,或者是没有连上相关联的数据表单,Params6的两个数组也只有Params6[0]有试卷ID,Params6[1]也是null值
      

  22.   

    你断点调试的方式错了,必须在那行后面增加一行代码,断点设置在下面一行,这样上面一行就能看到是否有数值,断点设置的那行会停住,你看断点所在行的返回值永远是null。另外我是想知道存储过程的SQL内容,不是C#如何调用的。
      

  23.   

    我又重新设置了一下断点,在将“Params6[1] = DB.MakeInParam("@Type", sqlDbType.VarChar,10, "综合题");”改成“问答题”时是有数据了,换成综合题就报题目中的错说明ds6是可以随时绑定除了综合题之外的其它题型的数据表单的。
    现在就是这个存储过程找不到,它的SQL语句也不清楚,估计就是里面的SELECT语句缺少了综合题这张表
    App_Code中定义的几个类的文件夹:AjaxClass(AjaxCommond.cs)、BusinessClass(ComprehensiveProblem.cs、Course.cs、Department.cs、FillBlankProblem.cs、JudgeProblem.cs、MultiProblem.cs、Papermr.cs、QuestionProblem.cs、Role.cs、Scores.cs、SingleProblem.cs、Usersmr.cs),找不到存储过程SQL的影子
      

  24.   

    这个字段是没有错的,错误出现在了ds6没有绑定到“综合题”这张表单,当绑定到“问答题”表单时可以正常显示,这两张表单是一模一样的。
    所以问题出现在了存储过程的调用中,“DataSet ds6 = DB.GetDataSet("Proc_PaperDetail", Params6);”这时ds6是null值。需要再存储过程的SQL语句中添加综合题这张表单,但是现在找不到,是不是被封装了?
      

  25.   

    楼主犯错了,存储过程必须在数据库中定义了,只能在数据库中去查看啊。
    使用命令 sp_helptext proc_name(你的存储过程的名字,此时应该是Proc_PaperDetailmr),就可以查看到了~
      

  26.   

    嗯犯错了,连这个都没搞明白!用了Doy00提供的查看指令后,发现Proc_PaperDetailmr的存储过程里面就是缺少了“综合题”这个表单的引用所以才会出现数据源为空的~
    大神您知道怎么修改已定义的存储过程吗?
      

  27.   

    安装个SQLSERVER的管理工具不就方便了吗?http://www.microsoft.com/downloads/zh-cn/details.aspx?familyid=08e52ac2-1d62-45f6-9a4a-4b76a8564a2b&displaylang=zh-cn
    其实Visual Studio也可以管理,但是功能没有这个强大。至于修改存储过程,其实只要执行ALTER语句即可,但是前提是你要会写SQL语句。不过用上述的工具就不需要那么麻烦,自动创建更改脚本,然后只要微调即可。
      

  28.   

    呃我的是SQL Server 2005,而连接中的是Microsoft® SQL Server® 2008 Management Studio Express集成环境,这个有影响吗?需要再额外安装SQL Server 2008吗?
      

  29.   

    高版本连接低版本没问题的,当然你也可以单独下载低版本的Management Studio
      

  30.   

    SQL Server 2005修改存储过程可以直接在数据库里面操作的,具体步骤——1、在对象资源管理器中,连接到某个数据库引擎实例,再展开该实例。2、依次展开“数据库”、存储过程所属的数据库以及“可编程性”。3、展开“存储过程”,右键单击要修改的过程,再单击“修改”。4、修改存储过程的文本。5、若要测试语法,请在“查询”菜单上,单击“分析”。6、若要修改存储过程,请在“查询”菜单上,单击“执行”。7、若要保存脚本,请在“文件”菜单上单击“另存为”。接受文件名或使用新名称替换它,再单击“保存”。