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

本文介绍了解决ASP.NET应用中遇到的“ORA-01036:非法变量名/编号”错误的方法。主要通过调整绑定方式、设置SqlDataSource属性来避免参数冲突。
今天做一个需要更新的界面,一开始老是出现“ORA-01036: 非法变量名/编号”的错误。开始以为是SQL语句写错了,将SQL语句挪到PL/SQL Developer中运行,一切正常。到网上查资料,发现相关问题很少,看来又是简单问题不知道哪儿搞错了。在优快云上晃了一圈,基本上是说“设置好参数类型”、“注意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)";

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值