DataBinding:“System.Data.DataRowView”不包含名为“Title”的属性。

lonely9292 2012-02-27 10:54:32
有一段程序,在未修改之前可以运行正常。本人想添加一个与之前有一样效果的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语句。
求助!!!!
...全文
1009 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
lonely9292 2012-03-01
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 qldsrx 的回复:]
高版本连接低版本没问题的,当然你也可以单独下载低版本的Management Studio
[/Quote]嗯那我就先下载一个,方便以后深入学习~谢谢你了大神,非常感谢你的耐心赐教!敬分~!
lonely9292 2012-03-01
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 doy00 的回复:]
SQL Server 2005修改存储过程可以直接在数据库里面操作的,具体步骤——

1、在对象资源管理器中,连接到某个数据库引擎实例,再展开该实例。

2、依次展开“数……
[/Quote]跪谢啦!!看来数据库的相关知识还是得好好学学啊~敬分!
Doy00 2012-03-01
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 lonely9292 的回复:]
嗯犯错了,连这个都没搞明白!用了Doy00提供的查看指令后,发现Proc_PaperDetailmr的存储过程里面就是缺少了“综合题”这个表单的引用。。。所以才……
[/Quote]
SQL Server 2005修改存储过程可以直接在数据库里面操作的,具体步骤——

1、在对象资源管理器中,连接到某个数据库引擎实例,再展开该实例。

2、依次展开“数据库”、存储过程所属的数据库以及“可编程性”。

3、展开“存储过程”,右键单击要修改的过程,再单击“修改”。

4、修改存储过程的文本。

5、若要测试语法,请在“查询”菜单上,单击“分析”。

6、若要修改存储过程,请在“查询”菜单上,单击“执行”。

7、若要保存脚本,请在“文件”菜单上单击“另存为”。接受文件名或使用新名称替换它,再单击“保存”。
qldsrx 2012-03-01
  • 打赏
  • 举报
回复
高版本连接低版本没问题的,当然你也可以单独下载低版本的Management Studio
lonely9292 2012-03-01
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 qldsrx 的回复:]
安装个SQLSERVER的管理工具不就方便了吗?http://www.microsoft.com/downloads/zh-cn/details.aspx?familyid=08e52ac2-1d62-45f6-9a4a-4b76a8564a2b&displaylang=zh-cn
其实Visual Studio也可以管理,但是功能没有这个强大。
[/Quote]呃我的是SQL Server 2005,而连接中的是Microsoft® SQL Server® 2008 Management Studio Express集成环境,这个有影响吗?需要再额外安装SQL Server 2008吗?
lonely9292 2012-02-29
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 qldsrx 的回复:]
下拉里面空的很正常,因为你不是通过它的数据控件绑定的,设计时不知道那个DataSet的存在,但是你可以自己填写里面可能存在的表名进去。[/Quote]
我把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来找到每种题型各自的表单”的。。。后台代码里面都找不到。
非常感谢你的耐心回答!!鞠躬~
lonely9292 2012-02-29
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 qldsrx 的回复:]

你看看GridView5的页面部分是否设置了那个属性,ASP.NET的标签属性既可以前台设置,也可以后台设置,DataSet做数据源的话,不设置DataMember,它就不知道绑定里面的哪个表了。
[/Quote]
嗯刚才仔细查看了之前的每一个GridView,里面的DataMember属性值都是空的,下拉框都没有选项,后台也没看到相应的代码设置。。。我也一直没弄个明白,仅靠DataSet ds5 = DB.GetDataSet("Proc_PaperDetailmr", Params5);和GridView5.DataSource = ds5;ds是怎么知道要绑定哪个具体的数据表单的?
方便加个QQ吗,非常感谢您~!327578710
qldsrx 2012-02-29
  • 打赏
  • 举报
回复
下拉里面空的很正常,因为你不是通过它的数据控件绑定的,设计时不知道那个DataSet的存在,但是你可以自己填写里面可能存在的表名进去。
另外我只是给你一个建议,毕竟我现在主要搞WinForm的开发,WEB是我C#入门时搞的,时间长了,也许问题不在那里,但是多一个可能性也是好的。
qldsrx 2012-02-29
  • 打赏
  • 举报
回复
安装个SQLSERVER的管理工具不就方便了吗?http://www.microsoft.com/downloads/zh-cn/details.aspx?familyid=08e52ac2-1d62-45f6-9a4a-4b76a8564a2b&displaylang=zh-cn
其实Visual Studio也可以管理,但是功能没有这个强大。

至于修改存储过程,其实只要执行ALTER语句即可,但是前提是你要会写SQL语句。不过用上述的工具就不需要那么麻烦,自动创建更改脚本,然后只要微调即可。
lonely9292 2012-02-29
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 qldsrx 的回复:]
存储过程是数据库里的,当然应该去数据库里找,你到cs文件里找有什么用?
估计你数据库没直接访问过,有管理工具的,访问数据库,然后看里面有些什么存储过程、函数、表等,这是数据库编程的必须知识啊。
[/Quote]嗯犯错了,连这个都没搞明白!用了Doy00提供的查看指令后,发现Proc_PaperDetailmr的存储过程里面就是缺少了“综合题”这个表单的引用。。。所以才会出现数据源为空的~
大神您知道怎么修改已定义的存储过程吗?
lonely9292 2012-02-29
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 doy00 的回复:]
楼主犯错了,存储过程必须在数据库中定义了,只能在数据库中去查看啊。
使用命令 sp_helptext proc_name(你的存储过程的名字,此时应该是Proc_PaperDetailmr),就可以查看到了~
[/Quote]呃。。犯大错了!!多谢指正啊~
Doy00 2012-02-29
  • 打赏
  • 举报
回复
楼主犯错了,存储过程必须在数据库中定义了,只能在数据库中去查看啊。
使用命令 sp_helptext proc_name(你的存储过程的名字,此时应该是Proc_PaperDetailmr),就可以查看到了~
qldsrx 2012-02-29
  • 打赏
  • 举报
回复
存储过程是数据库里的,当然应该去数据库里找,你到cs文件里找有什么用?
估计你数据库没直接访问过,有管理工具的,访问数据库,然后看里面有些什么存储过程、函数、表等,这是数据库编程的必须知识啊。
lonely9292 2012-02-29
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 orangeevan 的回复:]
title看下,区分大小写的。
[/Quote]这个字段是没有错的,错误出现在了ds6没有绑定到“综合题”这张表单,当绑定到“问答题”表单时可以正常显示,这两张表单是一模一样的。
所以问题出现在了存储过程的调用中,“DataSet ds6 = DB.GetDataSet("Proc_PaperDetail", Params6);”这时ds6是null值。需要再存储过程的SQL语句中添加综合题这张表单,但是现在找不到,是不是被封装了?。。。
lonely9292 2012-02-29
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 qldsrx 的回复:]
你断点调试的方式错了,必须在那行后面增加一行代码,断点设置在下面一行,这样上面一行就能看到是否有数值,断点设置的那行会停住,你看断点所在行的返回值永远是null。
另外我是想知道存储过程的SQL内容,不是C#如何调用的。
[/Quote]我又重新设置了一下断点,在将“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的影子
OrangeEvan 2012-02-29
  • 打赏
  • 举报
回复
title看下,区分大小写的。
qldsrx 2012-02-29
  • 打赏
  • 举报
回复
你断点调试的方式错了,必须在那行后面增加一行代码,断点设置在下面一行,这样上面一行就能看到是否有数值,断点设置的那行会停住,你看断点所在行的返回值永远是null。

另外我是想知道存储过程的SQL内容,不是C#如何调用的。
lonely9292 2012-02-29
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 qldsrx 的回复:]
Proc_PaperDetail这个存储过程怎么写的?或者你直接把AutoGenerateColumns="False" 改为AutoGenerateColumns="True"后,将GridView6的列定义都删除,这样它会自动产生所有的列,你根据自动产生的列来检查里面是否包含Title列。
[/Quote]断点调试时,ds6的值全部都是null值,说明没有连上数据源,或者是没有连上相关联的数据表单,Params6的两个数组也只有Params6[0]有试卷ID,Params6[1]也是null值。。。
lonely9292 2012-02-29
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 qldsrx 的回复:]
Proc_PaperDetail这个存储过程怎么写的?或者你直接把AutoGenerateColumns="False" 改为AutoGenerateColumns="True"后,将GridView6的列定义都删除,这样它会自动产生所有的列,你根据自动产生的列来检查里面是否包含Title列。
[/Quote]
在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;
}

哎,身边有个擅长这个存储过程的高手就好了。。。自学就是困难啊
qldsrx 2012-02-29
  • 打赏
  • 举报
回复
Proc_PaperDetail这个存储过程怎么写的?或者你直接把AutoGenerateColumns="False" 改为AutoGenerateColumns="True"后,将GridView6的列定义都删除,这样它会自动产生所有的列,你根据自动产生的列来检查里面是否包含Title列。
加载更多回复(18)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧