请问做一个GridView的嵌套,为什么出错提示ORA-01036,变量名或数值无效?

ecaol 2007-06-18 10:33:43
执行起来就提示
OracleException (0x80131938): ORA-01036,变量名或数值无效。
请高手帮忙看一下,不胜感激。
本程序的功能是在执行grv1的时候,实现grv1的数据distinct,然后以一个id对应多个在grv2中ID相同的记录的形式显示.

id | name
-------------------------
| Micheal
------------------
001 | Linc
------------------
| Bagwell
--------------------------
002 | Fenando
--------------------------
......


以下是程序代码:

protected void Page_Load(object sender, EventArgs e)
{
.......

String sqlcmd = " SELECT DISTINCT id FROM emp";
using (OracleConnection cn = COMUtility.GetConnection())
{
using (OracleDataAdapter da = new OracleDataAdapter(sqlcmd, cn))
{
DataSet ds = new DataSet();
da.Fill(ds, "emp");
DataTable dt = new DataTable();
dt = ds.Tables["emp"];
grv1.DataSource = ds.Tables["emp"];
grv1.DataBind();
}
}

.......
}

protected void grv1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
System.Data.DataRowView drv = (DataRowView)e.Row.DataItem;
String id drv.Row.ItemArray[0].ToString();
SqlDataSource sds = e.Row.FindControl("SqlDataSource1") as SqlDataSource;
sds.SelectParameters["id"].DefaultValue = id;
}
}

aspx代码:

<asp:GridView ID="grv1" runat="server" AutoGenerateColumns="False" DataKeyNames="id" AllowPaging="True" AllowSorting="True" PageSize="10" OnRowDataBound="grv1_RowDataBound" >
<Columns>
<asp:BoundField DataField="id" HeaderText="id" />
<asp:TemplateField HeaderText="" />
<ItemTemplate>
<asp:GridView ID="grv2" DataSourceID = "SqlDataSource1" runat="server" AutoGenerateColumns="False" DataKeyNames="name" >
<Columns>
<asp:BoundField DataField="name" HeaderText="name" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
ProviderName="<%$ ConnectionStrings:ConnectionString.ProviderName %>"
SelectCommand="SELECT * FROM emp WHERE [id] = @id">
<SelectParameters>
<asp:Parameter Name="id" type="String" />
</SelectParameters>
</asp:SqlDataSource>
...全文
351 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
amandag 2007-06-19
  • 打赏
  • 举报
回复
我没有oracle的环境,没办法测试,再看看你的id在数据库是字符串么?
ecaol 2007-06-19
  • 打赏
  • 举报
回复
多谢,amandag(高歌),把你的代码弄上去在我的环境下执行了一下,
在不挂任何参数的情况下一点问题都没有,但是加了参数又提示:
ORA-01036 这个错误了,真是奇怪
amandag 2007-06-19
  • 打赏
  • 举报
回复
测试代码,请参考

//aspx
<form id="form1" runat="server">
<asp:GridView ID="grv1" runat="server" AutoGenerateColumns="False" OnRowDataBound="grv1_RowDataBound">
<Columns>
<asp:BoundField HeaderText="au_id" DataField="au_id" />
<asp:TemplateField HeaderText="title_id">
<ItemTemplate>
<asp:GridView ID="grv2" DataSourceID = "SqlDataSource1" runat="server" AutoGenerateColumns="False" ShowHeader="false">
<Columns>
<asp:BoundField DataField="title_id" ReadOnly="True" SortExpression="title_id" ShowHeader="False" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:pubsConnectionString1 %>" SelectCommand="SELECT * FROM [titleauthor] WHERE ([au_id] = @au_id)">
<SelectParameters>
<asp:Parameter Name="au_id" Type="String" />
</SelectParameters>
</asp:SqlDataSource>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</form>

//aspx.cs
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
String sqlcmd = " SELECT DISTINCT au_id FROM titleauthor";
using (SqlConnection cn = new SqlConnection(@"server=.\SQLExpress;uid=sa;pwd=password;database=pubs"))
{
using (SqlDataAdapter da = new SqlDataAdapter(sqlcmd, cn))
{
DataSet ds = new DataSet();
da.Fill(ds, "emp");
// DataTable dt = new DataTable();
// dt = ds.Tables["emp"];
grv1.DataSource = ds.Tables["emp"];
grv1.DataBind();
}
}
}
}

protected void grv1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
System.Data.DataRowView drv = (DataRowView)e.Row.DataItem;
String au_id = drv.Row["au_id"].ToString();
SqlDataSource sds = e.Row.FindControl("SqlDataSource1") as SqlDataSource;
sds.SelectParameters["au_id"].DefaultValue = au_id;
}
}
}
amandag 2007-06-19
  • 打赏
  • 举报
回复
我测试了一下,没有问题,可以正常显示,可能不同的地方
1. Page_Load是否判断回传
2. 下面两句没用
DataTable dt = new DataTable();
dt = ds.Tables["emp"];
amandag 2007-06-19
  • 打赏
  • 举报
回复
==

我测试一下
ecaol 2007-06-19
  • 打赏
  • 举报
回复
没什么效果,用断点跟的时候,进入 grv1_RowDataBound 函数,
数据库里应该有5条记录,走完5次之后又进来了2次,但是被
if (e.Row.RowType == DataControlRowType.DataRow)判断没有成立,
过滤掉了,不知道那两次是在绑定哪些内容?可能会和我的问题有关?
amandag 2007-06-19
  • 打赏
  • 举报
回复
String id = drv.Row["id"].ToString();
ecaol 2007-06-19
  • 打赏
  • 举报
回复
不知道像代码中那样传值是否有问题,但是只传了一个参数,
而且传的都是String类型的,参数位置和类型的问题应该不会存在
ecaol 2007-06-19
  • 打赏
  • 举报
回复
这个不用,我的是要用三层GridView嵌套才能实现,
所以我简化了一下,想弄明白为什么SqlDataSource这里会出错,
并且用断点跟踪时发现执行这句:
sds.SelectParameters["id"].DefaultValue = id;
的时候,id都有正确的值,然后循环赋值,能不能赋进去不清楚,
但是都没有报错,直到所有值都被赋完要进入页面的时候才会出错。
String id drv.Row.ItemArray[0].ToString();这句话是我打错了,
抱歉程序里是有 = 号的
amandag 2007-06-19
  • 打赏
  • 举报
回复
顺便提一句,以楼主的这个Demo,应该不用GridView就能实现..
amandag 2007-06-19
  • 打赏
  • 举报
回复
String id drv.Row.ItemArray[0].ToString();
==========================================
String id = drv.Row.ItemArray[0].ToString();
NekChan 2007-06-19
  • 打赏
  • 举报
回复
protected void grv1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
System.Data.DataRowView drv = (DataRowView)e.Row.DataItem;
String id drv.Row.ItemArray[0].ToString(); //这有错误
SqlDataSource sds = e.Row.FindControl("SqlDataSource1") as SqlDataSource;
sds.SelectParameters["id"].DefaultValue = id;
}
}
killer_liqiao 2007-06-19
  • 打赏
  • 举报
回复
学习
winner2050 2007-06-19
  • 打赏
  • 举报
回复
这个是数据库的错误而已

net编程时有时会遇到莫名其妙的ora-01036错误。具体原因一般分析如下:
1、如错误介绍一样,你传入的参数和你语句中参数的顺序不同,或者树木不一致。
2、名字过长,oracle要求列名<32字符(起这么长名字的人也够变态的)
3、在声明中 new OracleParameter(PARM_NAME........) 其中PARM_NAME中不需要包含语句中的":"(补充一下,包含一般也不会有错误)
4、你小子没事干在数据类型后面多加了一个空格
ecaol 2007-06-19
  • 打赏
  • 举报
回复
是字符串的,没问题,
感觉好像是整个工程的全局部分,
为了安全的问题将前台页面的传参功能给屏蔽了,
具体还得验证一下,呵呵,多谢了,
验证出来我会来给大家一个答案的。

111,092

社区成员

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

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

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