Update M_QX_CZY Set LoginPass = @@LoginPass Where OperID = @@OperID
问题已经找到了,执行这句就报无效字符,因为loginpass是MD5加密后形成的字符串,所以oracle执行的时候隐式转换to_number所以报错,但是不知道怎么改,不知道有没有好方法
LoginPass 这个字段是number型的?
NVARCHAR2(200)
@nickma: 那怎么会存在隐式转换呢,而且oracle参数化SQL语句用的是“:”号。
@webaspx: 哎别人写的,这个是直接写在
Dictionary<string, IDbDataParameter> paras = new Dictionary<string, IDbDataParameter>
{
{"OperID",DBAccessPubFunc.GetDbParameter("OperID", DbType.Decimal)},
{"LoginPass",DBAccessPubFunc.GetDbParameter("LoginPass", DbType.String)}
};
然后用@@取那个传进来的参数
@nickma: SQLServer才用的是@,改成“:”试试吧。
@webaspx: 试了一下,还是无效字符ora-01722
@nickma: 你直接执行SQL语句会报错吗? Update M_QX_CZY Set LoginPass =‘’ Where OperID =1;
@webaspx: 这个直接update的时候set loginpass=‘@@loginpass’ 就没问题,就是引号,可是这样改之后数据库里的密码就变成@@loginpass,其实要是变相解决也行,就是吧数取出来拼接字符串,可是我想知道有没有能根本解决的,因为同事也有别的地方和这块一个毛病
@nickma: 需要你把代码贴出来,才能找到根本问题。
@webaspx:
public DBAccessSQLObject UpdatePass()
{
Dictionary<string, IDbDataParameter> paras = new Dictionary<string, IDbDataParameter>
{
{"OperID",DBAccessPubFunc.GetDbParameter("OperID", DbType.Decimal)},
{"LoginPass",DBAccessPubFunc.GetDbParameter("LoginPass", DbType.String)}
};
return new DBAccessSQLObject(HandlePlaceHolderChar(_UpdateLoginPassSQL), paras);
}
private static readonly string _UpdateLoginPassSQL =
"Update M_QX_CZY " +
" Set LoginPass = @@LoginPass " +
" Where OperID = @@OperID " + //操作员编号
"";
@nickma: 改成如下试过了?
private static readonly string _UpdateLoginPassSQL =
"Update M_QX_CZY " +
" Set LoginPass = :LoginPass " +
" Where OperID = :OperID " + //操作员编号
;
OperID这个参数值确定是数值型吗?
@webaspx: 试过了,不行 number(8)
@nickma: 那就不知道什么问题了。不好意思,没帮上忙。
@webaspx: 没事,问题都是讨论出来的嘛,我再找找看
加密后的语句中是不是含有数字,你讲赋的值to_char试试
加密后字母数字都有,还有符号
你试试Update M_QX_CZY Set LoginPass = to_char('加密后数据') Where OperID = OperID
@ice&ww: 这个也试了,不过我写的是to_char(@@loginpass)不行,你的意思是先取出来?
@nickma: 你是在程序中写的还是在数据库中写的呢?
@ice&ww: 程序啊
oracle执行的时候隐式转换to_number,这句话有问题把,应该是@@LoginPass传递的类型转换为NVARCHAR2(200)。
而且loginPass应该设置成varchar2(200)
晕,和varchar2没关系,你先上网看看隐式查询这个问题再说吧
Update M_QX_CZY Set LoginPass = @@LoginPass Where OperID = @@OperID
这行代码里面@@是你们自己的代码用这个符号获取变量值的吗?
还有,能不能给一个完整的样例,就是把你的@@LoginPass和@@OperID替换成真实的数据,同时把M_QX_CZY的建表语句贴出来?当然你可以改下某些关键字段的名字。