这种情况难道PB无解吗?
declare emp_cur cursor for
select mingwen
from md5info
where MDString(md5jiami1 + :sle_1.text,len(md5jiami1 + :sle_1.text))=:a;
open emp_cur;
fetch emp_cur into :b;
close emp_cur;
MDString是在程序中定义的一个函数,调用外部dll文件中的函数,md5jiami1是表中的一列,这样写无法正确执行,如何修改才能正确执行?问题就出在MDString是一个程序中的函数,sqlserver无法识别。数据窗口也试过,其实和写sql是一样的。
[解决办法]
string ls_string
MDString(md5jiami1 + :sle_1.text,len(md5jiami1 + :sle_1.text))
改成substring(md5jiami1 + :sle_1.text,len(md5jiami1 + :sle_1.text))
[解决办法]
MDString 作用难道跟substring一样
string ls_string
string ls_init_a
string ls_b
declare emp_cur cursor for
select md5jiami1,mingwen
from md5info;
open emp_cur;
fetch emp_cur into :ls_a,:b;
while sqlca.sqlcode = 0
ls_string = MDString(ls_a + :sle_1.text,len(ls_a + :sle_1.text))
if ls_string = ls_init_a then
ls_b = b
end if
loop
close emp_cur;
[解决办法]
SQL语句是提交到数据库执行再返回的,而你的MDString是程序的外部函数,运行在程序端,这显然不可行。为何不在数据库里自定义一个功能类似的MDString函数?
或者如果md5info表数据不多的话,你可以将md5info所有数据取到datastore中,然后SetFilter("MDString(md5jiami1 + "+sle_1.text+",len(md5jiami1 + "+sle_1.text+"))="+string(a)),再取过滤后的数据
[解决办法]
既然是内嵌在PB脚本中的游标,就肯定可以用数据窗口实现,而且效率更高。为什么钻这个牛角尖呢?
[解决办法]
分页啊,大数据量下当然不可能一次搞过来
[解决办法]
楼主的思路是错误的
我认为你的mdstring函数应该是个类似md5 has的函数
1.存储:数据库里应该是md5 has后的值
2.查询:先将字段has,然后where等值查询
[解决办法]
mdstring是一个外部函数吧。外部函数不能在嵌入式sql里使用
应该把数据库的字段内容取出来,再在脚本里进行运算对比
[解决办法]
第一: 游标 这东西 尽量 少用 无论在 pb里面还是 数据库里面
第二: 应该 从数据库里面查询 变形后的密码字段。。而不是现场计算。。
一般是
保存:明文-密文-保存
查询:查询密文 得到 用户
很少 像楼主这样操作。。。性能、、可靠性 全差很多。。。
[解决办法]
mdstring应该是你在PB脚本里使用的外部函数。外部函数不能在嵌入式sql里使用
你应该把 MDString(md5jiami1 + :sle_1.text,len(md5jiami1 + :sle_1.text)) 的值计算出来,赋值给变量,再在SQL中使用。
string x
x = MDString(md5jiami1 + :sle_1.text,len(md5jiami1 + :sle_1.text))
select mingwen
from md5info
where :x=:a;
[解决办法]
我感觉你应该看看数据库支不支持调用dll里函数,如果支持的话再数据库里自定义一个函数来实现这个功能
[解决办法]
你的这个函数MDstring是在PB中定义的一个函数吗?如果是的话,肯定无法执行
如果你把这个函数放在sqlserver里定义,应该是可以的
建议先把数据检索出来,然后再用你的函数判断数据是否符合条件
[解决办法]
游标尽量少用
[解决办法]
再次读了下楼主的帖子,发现 楼主 目标好像是从一个很大的用户表中查找 密码是 指定 值(:a)的用户来。。。而算法代码在dll中,叫 【MDString】 函数
如果 MDString 的算法可以在 sql中实现,那么在sql中 增加 函数 MDString ,就可以在sql语句中直接调用了,
否则。。简单来说有2种方式解决此问题
1 读取所有数据,然后 全部用MDString计算下,然后将计算的结果保存到 md5info 表里面(可以增加一个【新密文】字段)
2 读取所有数据,然后 就地计算 MDString,然后 立刻判断是否符合条件
可以利用 yejihui9527 的回复做少量修改就可以使用了
string ls_string
string ls_init_a //这里保存需要核对的目标:a
string ls_b
declare emp_cur cursor for
select md5jiami1,mingwen
from md5info;
open emp_cur;
while sqlca.sqlcode = 0
fetch emp_cur into :ls_a,:b;
ls_string = MDString(ls_a + sle_1.text,len(ls_a + sle_1.text))
if ls_string = ls_init_a then
ls_b = b
end if
loop
close emp_cur;
注意:
fetch emp_cur into :ls_a,:b; 必须在 循环体内执行。。不能在循环体外执行。。。否则只能执行一次。。这好像不符合要求
ls_b = b 语句得到了 mingwen 字段的值,但没有后续处理代码,如果得到一个就可以了,那么这里必须增加退出循环的代码 如 【exit】,如果每一个符合要求的记录全要找出来,那么这里需要增加 一个数组或者dw或则其他什么东西保存 mingwen 字段的值然后 在这段代码结束后,再来处理这个结果集
整个代码很奇怪。。。好像在找一个拥有相同密码的明文??在猜密码???仔细看了看,。,。。真在破解啊。。。呵呵。。。楼主在做坏事???嘎嘎。。。
mingwen 存放的是明文,,?
md5jiami1 存放的是md5计算后变形的密文 ?
MDString 是将密文解密的函数??还是 个加密函数??如果是加密函数,,则应该对明文进行处理。。。呵呵。。
[解决办法]
没什么样问题呀?
MDString是SQl函数吗?