于是转而到Google上搜索。在ASP.NET Forums上找到一个同样问题的帖子。经过一段时间的揣摩,问题终于得到了解决。帖子是E文的,而且比较零星,现将注意点整理如下:
一、Bind生成参数,Eval不生成参数
在前台代码中,Bind(双向绑定)会生成相对应的字段的一个参数,例如:
会产生一个:PASSWORD参数,于是,如果不对其作处理,在对Oracle数据库作Update操作时,会产生一个多余的参数。
将其修改成Text='<%# Eval("PASSWORD")问题得到解决。
这样子,就有两个解决方案:
a) 在不需要对插入的数据作任何特殊处理的时候:
把需要更新的绑定方式设置为“双向绑定”,并修改相应的UpdateCommand里的SQL语句。
b) 在需要对插入的数据作任何特殊处理的时候:
把所有列全部设置成“非双向绑定”,然后,在DetailsView的ItemUpdating事件中写入SQL语句及相应的参数。例如:
{
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);
}
二、SqlDataSource的ConflictionDetection属性需要设置成“OverwriteChanges”。
暂时搞不清楚原理,反正,只有这样设置了才能正常运作。
三、要注意SqlDataSource的OldValuesParameterFormatString属性
相应的原始参数的前缀必须与SqlDataSource的OldValuesParameterFormatString属性里设置的格式相对应,不然也会出现错误。
例如,OldValuesParameterFormatString属性为“original_{0}”,则SQL语句要写成如下形式:
SqlDataSource1.UpdateCommand = "UPDATE TEST.TB SET USERNAME = :USERNAME, PASSWORD=:PASSWORD, EMAIL=:EMAIL WHERE (ID = :original_ID)";