ORA-01036: 非法变量名/编号

  今天做一个需要更新的界面,一开始老是出现“ ORA-01036: 非法变量名 / 编号 ”的错误。开始以为是 SQL 语句写错了,将 SQL 语句挪到 PL/SQL Developer 中运行,一切正常。到网上查资料,发现相关问题很少,看来又是简单问题不知道哪儿搞错了。在 CSDN 上晃了一圈,基本上是说“设置好参数类型”、“注意 CommandType 属性”等的。未能解决问题。

于是转而到Google上搜索。在ASP.NET Forums上找到一个同样问题的帖子。经过一段时间的揣摩,问题终于得到了解决。帖子是E文的,而且比较零星,现将注意点整理如下:

一、Bind生成参数,Eval不生成参数

在前台代码中,Bind(双向绑定)会生成相对应的字段的一个参数,例如:

< asp:TextBox ID = " tbPassword "  runat = " server "  TextMode = " Password "  Text = ' <%# Bind("PASSWORD") %> ' ></ asp:TextBox >

 

会产生一个:PASSWORD参数,于是,如果不对其作处理,在对Oracle数据库作Update操作时,会产生一个多余的参数。

将其修改成Text='<%# Eval("PASSWORD")问题得到解决。

这样子,就有两个解决方案:

a)         在不需要对插入的数据作任何特殊处理的时候:

把需要更新的绑定方式设置为“双向绑定”,并修改相应的UpdateCommand里的SQL语句。

b)        在需要对插入的数据作任何特殊处理的时候:

把所有列全部设置成“非双向绑定”,然后,在DetailsViewItemUpdating事件中写入SQL语句及相应的参数。例如:

   

 

protected   void  DetailsView1_ItemUpdating( object  sender, DetailsViewUpdateEventArgs e)
{

        
string  username  =  ((TextBox)((DetailsView)sender).Rows[ 0 ].Cells[ 0 ].FindControl( " tbUserName " )).Text.Trim().ToUpper();
        
string  password  =  ((TextBox)((DetailsView)sender).Rows[ 1 ].Cells[ 0 ].FindControl( " tbPassword " )).Text.Trim();
        
string  email  =  ((TextBox)((DetailsView)sender).Rows[ 2 ].Cells[ 0 ].FindControl( " tbEmail " )).Text.Trim();

        SqlDataSource1.UpdateCommand 
=   " UPDATE TEST.TB SET USERNAME = :USERNAME, PASSWORD=:PASSWORD, EMAIL=:EMAIL WHERE (ID = :original_ID) " ;

         SqlDataSource1.UpdateParameters.Clear();
        SqlDataSource1.UpdateParameters.Add(
" :USERNAME " , username);
        SqlDataSource1.UpdateParameters.Add(
" :PASSWORD " , FormsAuthentication.HashPasswordForStoringInConfigFile(password, " MD5 " ));
        SqlDataSource1.UpdateParameters.Add(
" :EMAIL " , email);

}

 

二、SqlDataSourceConflictionDetection属性需要设置成“OverwriteChanges”。

暂时搞不清楚原理,反正,只有这样设置了才能正常运作。

三、要注意SqlDataSourceOldValuesParameterFormatString属性

相应的原始参数的前缀必须与SqlDataSourceOldValuesParameterFormatString属性里设置的格式相对应,不然也会出现错误。

例如,OldValuesParameterFormatString属性为“original_{0}”,则SQL语句要写成如下形式:

SqlDataSource1.UpdateCommand = "UPDATE TEST.TB SET USERNAME = :USERNAME, PASSWORD=:PASSWORD, EMAIL=:EMAIL WHERE (ID = :original_ID)";

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值